Целочисленное деление против двойного деления - вопрос оптимизации - PullRequest
0 голосов
/ 14 ноября 2010

Какая операция должна быть быстрее на процессоре x86 в Linux и каковы средние различия (в%):

unsigned int x, y, z;
x = y / z;

или

double x, y, z;
x = y / z;

Операция на двойнике будет выполняться FPU, и CPU может продолжить выполнение других команд. Это правильно? Зависит ли это от флагов компиляции (я использую gcc с флагом -O3)?

Ответы [ 3 ]

3 голосов
/ 14 ноября 2010

Если ваша работа по своей сути основана на целочисленных значениях, преобразования int-float и float-int могут разрушить любое повышение производительности. Преобразование по умолчанию в C (усечение) может быть особенно медленным на старых чипах Intel.

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

0 голосов
/ 14 ноября 2010

Интегральные операции обычно выполняются быстрее, чем их аналог с плавающей запятой. Разница в основном зависит от аппаратного обеспечения: на некоторых платформах даже нет FPU.

Такая простая операция вообще не должна зависеть от вашей операционной системы или от флагов компилятора: это должны быть простые инструкции по сборке.

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

0 голосов
/ 14 ноября 2010

Отдельная инструкция деления с плавающей точкой займет больше времени, чем целочисленная.Однако, если вы делаете много подряд, они достигнут примерно одинаковой скорости из-за конвейеризации (по крайней мере, на современном x86).с другими операциями, пока FPU занят.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...