Страницы

четверг, 3 августа 2017 г.

Накладные расходы проверок

Сделал тест для измерения накладных расходов проверок корректности времени исполнения, которыми транслятор сопровождает основной код. Воплощены проверки: переполнения типа, выхода за границы массива, использования неинициализированных переменных, приведения базовой записи к расширенной, пользовательские ASSERT. Тест представляет собой специальную сборку транслятора, которая несколько раз собирает сама себя. Полагаю, это хороший практический тест. Для сравнения добавлены проверки, доступные в современных компиляторах С: fsanitize=address и fsanitize=undefined.

Для запуска теста используется сценарий benchmark.sh, находящийся в каталоге проекта.

Компилятор: gcc-6.3.0 -O3 -flto.

Размер, байтРазмер, отношениеВремя, секундВремя, отношение
Без проверок 161 776 1 0.27 1
Восток 219 128 1.35 0.34 1.26
asan undefined 1 284 392 7.93 0.42 1.56
asan address 566 520 3.5 0.74 2.74
asan addr+undef 3 006 456 18.58 0.90 3.33
Восток+addr+undef3 637 976 22.49 1.04 3.85

Проверки ещё несовершенны, поэтому можно ожидать некоторого увеличения накладных расходов по мере улучшения транслятора.

5 комментариев:

  1. Размер, допустим -- не актуально. А вот ,что касается проверок -- уж лучше пусть будут.

    ОтветитьУдалить
    Ответы
    1. Кстати ,я делал замеры по вендой для Компонентного Паскаля относительно Си гнутого -- результат такой же. В 4 раза -- это разумная плата за безопасность.

      Удалить
    2. В данном эксперименте в 4-раза - это с бооольшой перестраховкой. А так - 1.26.

      Удалить
    3. Если поотключать все проверки. Точно такой же результат, если компилить под ББ с ключами отключения проверок))

      Удалить
    4. Нет, с проверками, которые вставляет транслятор "Востока". Остальные накладные расходы дают проверки, встроенные в gcc.

      Удалить

Обработка ошибок

Тема корректной обработки ошибок в программе является довольно сложным вопросом в программировании. Отчасти от того, что и она сама являет...