Наверху кастинга вдвое большего по сравнению с плаванием?

Или если Вы хотите установить его, так, чтобы это всегда использовалось с urllib2.urlopen (таким образом, Вы не должны сохранять ссылку на новичка вокруг):

import urllib2
url = 'www.proxyurl.com'
username = 'user'
password = 'pass'
password_mgr = urllib2.HTTPPasswordMgrWithDefaultRealm()
# None, with the "WithDefaultRealm" password manager means
# that the user/pass will be used for any realm (where
# there isn't a more specific match).
password_mgr.add_password(None, url, username, password)
auth_handler = urllib2.HTTPBasicAuthHandler(password_mgr)
opener = urllib2.build_opener(auth_handler)
urllib2.install_opener(opener)
print urllib2.urlopen("http://www.example.com/folder/page.html").read()
8
задан Polaris878 23 September 2009 в 16:21
поделиться

8 ответов

Как сказал Майкл Берр, хотя накладные расходы сильно зависят от вашей платформы, накладные расходы определенно меньше, чем время, необходимое для их передачи по сети.


приблизительная оценка:

Полезная нагрузка 800 Мбит / с на отличном гигабитном кабеле, 25 Мбит / с с плавающей точкой в ​​секунду.

На одноядерном процессоре 2 ГГц это дает колоссальные 80 тактовых циклов для каждое значение преобразуется в безубыточность - ничего меньше, и вы сэкономите время. Этого должно быть более чем достаточно для всех архитектур :)

Простой цикл загрузки-сохранения (без всех задержек кэширования) должен быть меньше 5 циклов на значение. С чередованием инструкций, расширениями SIMD и / или распараллеливанием на нескольких ядрах вы, вероятно, будете выполнять несколько преобразований за один цикл.

Кроме того, получателю будет удобно обрабатывать только половину данных. Помните, что время доступа к памяти нелинейно.


Единственное, что возражает против преобразования, это то, что передача должна иметь минимальную нагрузку на ЦП: современная архитектура может передавать данные с диска / памяти на шину без вмешательства ЦП. Однако с приведенными выше цифрами я бы сказал, что на практике это не имеет значения.

[править]
Я проверил некоторые числа, сопроцессору 387 действительно потребовалось бы около 70 циклов для цикла загрузки-сохранения. На начальном Pentium у вас осталось 3 цикла без какого-либо распараллеливания.

Итак, если вы не запустите гигабитную сеть на 386 ...

11
ответ дан 5 December 2019 в 04:55
поделиться

Это будет зависеть от вашей реализации библиотек C ++. Протестируйте и посмотрите.

9
ответ дан 5 December 2019 в 04:55
поделиться

Даже если это займет время, это не будет самой медленной точкой в ​​вашем приложении.
Ваш FPU может выполнять преобразование намного быстрее, чем он может отправлять сетевой трафик (поэтому узким местом здесь, скорее всего, будет запись в сокет).

Но, как и во всех подобных вещах, измерьте это и посмотрите.

Лично я не думаю, что время, проведенное здесь, повлияет на реальное время, потраченное на отправку данных.

6
ответ дан 5 December 2019 в 04:55
поделиться

Предполагая, что вы говорите о значительном количестве пакетов для отправки данных (разумное предположение, если вы отправляете миллионы значений), приведение двойников к плавающим, вероятно, уменьшит количество сетевых пакетов примерно наполовину (при условии sizeof (double) == 8 и sizeof (float) == 4 ).

Почти наверняка экономия сетевого трафика будет преобладать независимо от времени, потраченного на преобразование. Но, как все говорят, измерение некоторых тестов будет доказательством пудинга.

4
ответ дан 5 December 2019 в 04:55
поделиться

Принимая во внимание, что большинство компиляторов обрабатывают удвоения намного эффективнее, чем float - многие продвигают float в double перед выполнением операций с ними - я бы подумал о том, чтобы взять блок данных, сжать / сжать его, а затем отправить сжатый блок. В зависимости от того, как выглядят ваши данные, вы можете получить сжатие 60-90% по сравнению с 50%, которые вы получите при преобразовании 8-байтовых значений в четыре байта.

3
ответ дан 5 December 2019 в 04:55
поделиться

У вас нет другого выбора, кроме как измерить их самостоятельно и посмотреть. Вы можете использовать таймеры для их измерения. Похоже, некоторые уже реализовали изящный класс таймера C ++

2
ответ дан 5 December 2019 в 04:55
поделиться

Я думаю, что это приведение намного дешевле, чем вы думаете, поскольку на самом деле оно не требует каких-либо вычислений. Фактически, это просто сдвиг битов, чтобы избавиться от некоторых цифр в экспоненте и мантиссе.

2
ответ дан 5 December 2019 в 04:55
поделиться

Это также будет зависеть от процессора и его поддержки с плавающей запятой. В старые добрые времена (1980-е годы) процессоры поддерживали только целочисленные операции. Математику с плавающей запятой нужно было эмулировать в программном обеспечении. Отдельный чип для операций с плавающей запятой (сопроцессор ) можно было купить отдельно.

Современные процессоры теперь имеют инструкции SIMD , поэтому можно обрабатывать большие объемы данных с плавающей запятой одновременно. Эти инструкции включают MMX, SSE, 3DNow! и тому подобное. Ваш компилятор может знать, как использовать эти инструкции, но вам может потребоваться написать свой код определенным образом и включить правильные параметры.

Наконец, самый быстрый способ обработки данных с плавающей запятой - это видеокарта . Достаточно новый язык под названием OpenCL позволяет отправлять задачи на видеокарту для обработки.

Все зависит от того, какая производительность вам нужна.

1
ответ дан 5 December 2019 в 04:55
поделиться