2013-06-08 3 views
-1

Интересно, является ли сумма быстрее, чем продукт на недавнем CPUS. Вычисление суммы математически проще, но могут быть оптимизации для ускорения умножения в процессоре; Я не знаю.Суммируется быстрее, чем умножается?

В моем случае я хочу объединить два уровня шума и применить к ним порог. Я мог бы просто умножить их, поскольку они находятся в диапазоне от 0 до 1 и применяют пороговое значение в том же диапазоне. Или я мог бы добавить их вместе и применить порог где-то в диапазоне от 0 до 2. Я знаю, что алгоритмы не идентичны, но оба будут соответствовать моим требованиям.

+4

Вы говорите, что ваш код слишком медленный, потому что вы умножаетесь вместо суммирования или что это гипотетический вопрос, и вы еще не написали код? –

+2

Это одна из тех ситуаций, когда вы должны сначала определить, нужно ли вам знать, какой из них быстрее, и если вы это сделаете, профилируйте оба в реалистичном сценарии. – juanchopanza

+0

Я пробовал оба, и оба они достаточно быстр. Хотя я задал этот вопрос, просто для интереса. – danijar

ответ

3

Я понимаю, мы говорим с плавающей точкой здесь, а не целочисленных операций, так как вы упоминаете диапазон от 0 до 1.

В этом случае, не существует огромная разница. Точно, какая разница, зависит от фактического процессора, на котором выполняется код, точной последовательности операций (одна операция зависит от другой, где ответ не «готов», пока бит позже и т. Д., Где другой алгоритм позволяет больше вычислений, которые должны выполняться параллельно). Таким образом, вам нужно будет фактически реализовать две версии кода и измерить разницу в вашей системе. Если это что-то для запуска на разных машинах, вам нужно будет измерить его на нескольких типах машин с разными процессорами.

Это, конечно, предполагает, что это действительно так важно, чтобы быть «быстрым». Сколько времени это занимает, и есть ли предел того, как долго вам «разрешено».

2

Стандартный ответ на вопросы оптимизации:

Сделайте осуществление правильной и читаемым первым. Затем проверьте, обеспечивает ли это приемлемую производительность. Если это не так, прокомментируйте свой код и проверьте, где вы теряете большую часть времени обработки. Тогда измените это точно.

Возможно, вам потребуется изменить читаемый код для второго шага, но поскольку вы сделали его правильным и читаемым, сначала у вас есть базовая линия для сравнения, и вы можете прочитать, что делает код в первую очередь.

2

Типичный (изменяется от процессора к процессору) чисел для x86 являются

 Latency 1/Throughput 
fp add: 3   1 
fp mul: 5   1-3 
int add: 1   < 1 
int mul: 3-7  1-4 

Целые с большим количеством битов медленнее размножаться, и двойной ширины умножение (не выражается в C) еще медленнее.

Большая разница между Int оных и Int мул не означает, что вы должны написать a+a (или a << 1) вместо a*2, источник не (непосредственно), что определяет производительность, в результате машинный код делает, и все в любом случае серьезные компиляторы будут делать снижение силы.

+0

C: 'int factor1 = 6, factor2 = -9; long product = (long) factor1 * factor2; '(hm. Предполагает размер long> sizeof int (даже sizeof long> = 2 * sizeof int), а в книге указано sizeof long> = sizeof int.) – greybeard

+0

@greybeard, даже если он работает (что, как вы заметили, не гарантируется), это будет просто повышаться, за которым следует регулярное умножение, а не умножение, которое дает результат в два раза более широкий, чем его тип операнда. Достаточно Smart Compiler может распознать шаблон и использовать его в любом случае, это не то, что буквально говорит код. – harold

Смежные вопросы