Thursday, March 17, 2011

Делить или умножать?

Сегодня информатик на лекции заявил, что следует писать не x / 2.0, а x * 0.5 , ибо деление тормознее умножения. Как показала проверка, это действительно так (в данном случае деление раза эдак в 3 медленнее).

Однако из этого не следует делать вывод, что в критичных местах кода нужно заменять деление на умножение — благо большинство компиляторов управятся с этой тягомотиной куда быстрее вас. Более того, они к тому, что получилось после замены деления на умножение, таких оптимизаций (на уровне машинных инструкций) наприменяют, что вам и не снилось.

Перейдём к циферкам.

Использовался gcc 4.4.5.
Тестовый код:
const int N = 100000000;
double x; int i;
int main() {
    for (i = 0; i < N; ++i)
        x = i / 2.0; // или же i * 0.5
    return 0;
}

При компиляции безо всяких флагов результаты следующие: деление — 5.5 секунд, умножение — 1.6 секунды. Ух ты, надо всюду умножение использовать!

А теперь компилируем со слабой оптимизацией (-O1) и осознаём, что все наши усилия по оптимизации кода были смехотворны: теперь в обоих вариантах получилось 1.1 секунды.

(Между прочим: у fpc, похоже, с floating-point оптимизациями дела обстоят паршиво. У gpc (который из GNU Compiler Collection)  — нормально, вроде бы так же, как и у gcc (в общем-то, неудивительно). Надеюсь, в этих ваших Delphi с этим норма а хотя не, фтопку делфи ^_^)

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

No comments:

Post a Comment