воскресенье, 27 июня 2010 г.

ускорение

В годы моего спортивного участия разница между программкой на C и Pascal (да, было время когда в спорте писали на этом, причем большинство) составляла порядка 20-30% скорости в пользу С.

В Pascal еще можно было выставить оптимизирующие опции компилятору ({$O+, R-} или что-то подобное), что давало 10-20 % скорости.

Была одна техническая задачка: найти транзитивное замыкание для графа n = 1000. Понятно дело, что чистый куб не проходит, быстро умножать матрицы никто не умеет, поэтому надо уменьшать константу (переходить на битовые представления, и всякие линейные оптимизации). Мы еще сконденсировали сильно связные, получили ацикличный, и на нем... В общем работало, но ТЛ на каком-то. И за 2-3 минуты до конца вспомнили об опциях компилятору - прошло. Это был последний АС среди всех :) .

Сейчас я пишу нечто алгоритмическое, и выжимаю константу. Наконец-то вспомнил про debug/release. Переключил в release и получил 3-х (!!!) кратное ускорение. Даже боюсь представить, что будет когда я перейду с С# на чистый C без всяких виртуальных методов. Но этого я делать пока не буду.

Update[29.06.10]
Как мне пояснили, в debug без оптимизации вставляется куча nop-ов после каждой строчки кода. Что бы можно было просто дебажить (в т.ч. условные breakpoint) и модифицировать код без перекомпиляции. То есть все jmp остаются нетронутыми при возможной обработке. В общем не забывайте про release.

Это лучше, чем вызывать asm int 3 :) .

Комментариев нет: