nyaload

Журнал Пушыстого

Журнал Пушыстого

Entries by tag: с++

Оставляйте ассерты в коде :)
nyaload
_winnie
Сегодня столкнулся с волшебством: программа с NDEBUG=1 (т.е. с отключённой проверкой ассертов) работает медленнее, процентов на 10

Начинаю комментировать по очереди assertы, нахожу тот, который ускоряет работу.

Меняю провеку assert(buf[n]== '\n') на volatile char _unused = buf[n] - и этот volatile ускоряет работу так же как assert. Переношу код из main в отдельную функцию - мистика исчезает. В чем дело (патерн ли доступа к памяти, выравнивание ли инструкций ли, рандомная кривизна компилятора, ещё что-то) не выяснял, мне было не очень важно.

Хорошая демонстрация того, что x86/c++ компилятор - непредсказуемый черный ящик, и что если важны проценты производительности - надо автоматизировать тесты производительности и запускать после каждой перекомпиляции бинарника, на куче разных конфигураций.

Код, что бы не бысть голословным ( процессор - corei7 3770k, компилятор - g++ 4.5.3, компиляция - "g++ -O3 -DNDEBUG=1" и "g++ -O3", glibc/OS - cygwin на Win7 , файл всегда в кеше и для каждой сборки делается несколько запусков для проверки стабильности измерения ), но скорее всего у других людей это не воспроизведётся. На Intel Xeon и настоящем линуксе не воспроизвелось. Программа итерирутся по строчкам файла (fgets, только в разы быстрей).
Tags:

?

Log in