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 с этим норма а хотя не, фтопку делфи ^_^)

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

Sunday, March 13, 2011

обо всём и ни о чём

(Как-то вот не набирается мыслей на полноценный пост. Хоть на каком-нибудь juick аккаунт заводи...)

Итак, на прошлой неделе...

Обнаружил ништяковый шрифт под названием Consolas. (Если что от Microsoft и может быть хорошего, так это шрифты. Ну ладно-ладно, DirectX ещё, так и быть.) Заодно удосужился наконец разобраться, что такое subpixel rendering и hinting.

Открыл для себя Padrino — веб-фреймворк на Ruby. Всё-таки Rails как-то монструозен, а Sinatra, наоборот, слишком минималистична (или '-ен'? а, пофиг). Ну и с Heroku пришлось подружиться, альтернативных бесплатных хостингов для Ruby-приложений и нет фактически.

А ещё принял участие в perplexed!. Что за турнир — объяснять долго, по ссылке можете заиметь представление. Вообще, чумовая вещь =) Маньяки-организаторы (что символично, индусы) изначально планировали сделать его 12-часовым, но всё же укоротили до 8-ми часов. Никогда ещё такой извращенский код не писал)))

А ещё... Ой, не, пожалуй, хватит ^_^