?

Log in

No account? Create an account
nyaload

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

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

Previous Entry Share Next Entry
Оставляйте ассерты в коде :)
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:


  • 1
Бугага. Ещё смешнее, когда длина командной строки меняет layout в памяти и перформанс плавает в пределах 20%, а то и больше.

командная строка это еще ничего -- хуже когда environment. мы так искали, почему у двух юзеров один и тот же бинарник разные цифры производительности показывает.

20%? А на искусственном примере воспроизводится?

http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=7196911

Ну здесь не 20%, а 5%, но на микробенчах может быть и 100%.

Даже в одном и том же окружении, одна и та же командная строка, один и тот же бинарник, — время микробенчмарка может может сильно скакать. Поэтому нужно не только при каждом запуске повторять операцию много раз в нескольких сериях, но и сделать несколько отдельных запусков.

  • 1