Не существует единого «процессора ЦП», особенно с точки зрения того, какие операции оптимизированы по отношению к другим !, но большинство из них, на уровне ЦП (особенно в пределах FPU), таковы, что ответ на ваш вопрос:
- двойные операции, такие же быстрые или
быстрее, чем операции с плавающей точкой для +, -,
* и /?
- это "да" - в ЦП , за исключением деления и sqrt, которые несколько медленнее для double
, чем для float
. (Предполагая, что ваш компилятор использует SSE2 для скалярной математики FP, как это делают все компиляторы x86-64, и некоторые 32-битные компиляторы, в зависимости от опций. В старых версиях x87 ширина регистров не различается, только в памяти (он конвертируется при загрузке / хранении) ), поэтому исторически даже sqrt и разделение были такими же медленными для double
).
Например, Haswell имеет пропускную способность divsd
один на 8-14 циклов (зависит от данных), но divss
(скалярная единичная) пропускная способность один на 7 циклов. x87 fdiv
- пропускная способность от 8 до 18 циклов. (Числа от https://agner.org/optimize/. Задержка коррелирует с пропускной способностью для деления, но выше, чем числа пропускной способности.)
Версии float
многих библиотечных функций, таких как logf(float)
и sinf(float)
, также будут быстрее , чем log(double)
и sin(double)
, потому что они имеют намного меньше битов точности, чтобы получить право , Они могут использовать полиномиальные аппроксимации с меньшим количеством терминов, чтобы получить полную точность для float
против double
Однако , занимающий вдвое больше памяти для каждого числа, явно подразумевает повышенную нагрузку на кэш (ы) и большую пропускную способность памяти для заполнения и пролива этих строк кэша из / в ОЗУ ; время, когда вы заботитесь о производительности операции с плавающей запятой, это когда вы выполняете много таких операций, поэтому вопросы памяти и кэша имеют решающее значение.
@ Ответ Ричарда указывает на то, что есть и другие способы выполнения операций FP (инструкции SSE / SSE2; старый добрый MMX был только для целых чисел), особенно подходящий для простых операций с большим количеством данных ( «SIMD», одна инструкция / несколько данных) где каждый векторный регистр может содержать 4 плавающих одинарной точности или только 2 с двойной точностью , поэтому этот эффект будет еще более заметным.
В конце концов, вам действительно нужно провести эталонный тест, но мой прогноз заключается в том, что для разумных (то есть больших ;-) эталонных тестов вы найдете преимущество придерживаться с одинарной точностью (при условии, конечно, что вам не нужны дополнительные биты точности! -).