Пушыстый (_winnie) wrote,
Пушыстый
_winnie

Categories:

Оставляйте ассерты в коде :)

Сегодня столкнулся с волшебством: программа с 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: с++
Subscribe
  • Post a new comment

    Error

    default userpic

    Your reply will be screened

    Your IP address will be recorded 

    When you submit the form an invisible reCAPTCHA check will be performed.
    You must follow the Privacy Policy and Google Terms of use.
  • 11 comments