Measurement
Содержание
Eterforcetest —измерение скорости функций WinAPI
В связи с невозможностью проводить измерения (профилирование) используемого функциями процессорного времени непосредственно на программе (1С 7.7), был создан набор тестов, измеряющий время для заданных функций.
Тест может выполняться в Wine и Windows.
Получить тест
- Тест в виде EXE-файла:
ftp://updates.etersoft.ru/pub/Etersoft/Eterforcetest/eterforcetest.exe
- Репозиторий с исходным кодом:
http://git.etersoft.ru/people/lav/packages/eterforcetest.git
Использование
eterforcetest [название_набора_тестов]
При запуске без параметров производятся тесты по всем направлениям.
При указании конкретного, например, string, проводятся тесты только из набора тестов на строковые функции.
eterforcetest --list
выведет список всех доступных тестов
При выполнении теста выводятся строки наподобие
Test for GetTickCount ..... 1.254mks pc ( 4380 ms) (100%) (1/10 - 3.50m iterations)
Что означает:
- Функция GetTickCount использует 1,25 микросекунды на каждый вызов;
- Выполнения цикла вызовов GetTickCount заняло 4380 миллисекунд,
- что составляет 100% от эталонного значения;
- была выполнена только 1/10 часть от полного цикла измерений;
- всего при измерении было выполнено 3,5 миллиона вызовов GetTickCount;
Для устранения случайных влияний внутри каждого цикла оформляется 5 подциклов измерений с заведением своего отсчёта и дальнейшим усреднением результатов.
Разработка
Измерение времени работы функций
Тесты создаются следующего вида:
static CHAR *str; MSTART(1, "strchr", 1) { str = strchr(TEST_STRING, 'z'); } MEND
Параметры MSTART:
- флаг, ненулевое значение которого разрешает выполнения теста
- текстовое описание тестируемой функции
- делитель для количества итераций (если функция такова, что 7 млн. итераций выполняется очень долго)
Обратите внимание на статический str и присваивание ему результата работы функции. Без этого компилятор может выкинуть функцию, результат работы которой не используется.
Проблемы
Замечено, что функции, помеченные inline, на самом деле inline не становятся.