Сделал тест для измерения накладных расходов проверок корректности времени исполнения, которыми транслятор сопровождает основной код. Воплощены проверки: переполнения типа, выхода за границы массива, использования неинициализированных переменных, приведения базовой записи к расширенной, пользовательские 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+undef | 3 637 976 | 22.49 | 1.04 | 3.85 |
Проверки ещё несовершенны, поэтому можно ожидать некоторого увеличения накладных расходов по мере улучшения транслятора.
Размер, допустим -- не актуально. А вот ,что касается проверок -- уж лучше пусть будут.
ОтветитьУдалитьКстати ,я делал замеры по вендой для Компонентного Паскаля относительно Си гнутого -- результат такой же. В 4 раза -- это разумная плата за безопасность.
УдалитьВ данном эксперименте в 4-раза - это с бооольшой перестраховкой. А так - 1.26.
УдалитьЕсли поотключать все проверки. Точно такой же результат, если компилить под ББ с ключами отключения проверок))
УдалитьНет, с проверками, которые вставляет транслятор "Востока". Остальные накладные расходы дают проверки, встроенные в gcc.
Удалить