Бенчмаркинг с googletest?
Фон (перейдите к вопросу ниже, если не заинтересованы)
У меня есть симулятор, который проходит через три состояния:
- Однопоточный запуск (ввод/вывод в порядке)
- Многопоточный блок моделирования с привязкой к памяти в режиме (I/O не нормально)
- пост-симуляция, однопоточный этап после объединения (I/O ok)
Что за черт! Во время стандартного тестирования загрузка процессора снизилась с на 100% до 20%, а общий прогон занял около в 30 раз дольше, чем обычно (130 сек. Против 4.2 сек.).
Когда Callgrind
не обнаружил ничего подозрительного, моя голова жужжала, когда я был на обрыве качки назад к последнему фиксации, потеряв все исправления ошибок.
Не поощряя, я вошел в серверную комнату во время пробега и заметил неприятные звуки измельчения, подтвержденные позже, которые были вызваны записью в сокеты Mysql в qaru.site/info/435257/...!!! Оказалось, что код Mysql, несколько слоев в глубине этапа 2, вызывал проблемы.
Извлеченные уроки
- Случайный ввод-вывод может быть смертельным для приложения реального времени.
- Тестирование модулей не достаточно: мне также нужен бенчмаркинг
Fix. Я расскажу об IOSentinels с локальным ядром и утвердит() на ReadAllowed() и WriteAllowed(), чтобы гарантировать, что потоки Stage 2 никогда не будут выполнять IO.
Вопрос
Кому-нибудь повезло с прикреплением/записью рамки сравнения с googletest?
К сожалению, все мои googleests прошли на этот раз. Если бы я немного отошел и вернусь, не заметив время выполнения, это было бы катастрофическим фиксацией и, возможно, намного сложнее исправить.
Я бы хотел, чтобы googletest потерпел неудачу, если пробег занимает > 2 или 3 раза больше последней версии: эта последняя часть сложна, потому что для очень быстрых запусков состояние системы может привести к тому, что что-то займет в два раза больше, но все равно будет нормально. Но для долгого симулятора/теста я не ожидаю, что время автономной работы сильно изменится ( > 50% будет необычным).
Я открыт для предложений здесь, но было бы неплохо провести проверку с низким уровнем обслуживания, которая будет работать с автоматическим тестированием, поэтому будет очевидно, что система внезапно стала медленной, даже если все выходы выглядят нормально.
Ответы
Ответ 1
Разве это не так просто, как
const clock_t t0 = clock(); // or gettimeofday or whatever
int res = yourFunction();
const clock_t t1 = clock();
const double elapsedSec = (t1 - t0) / (double)CLOCKS_PER_SEC;
EXPECT_EQ(EXPECTED, res);
EXPECT_GT(10.0, elapsedSec);
Здесь вам нужно вручную изменить 10.0 в зависимости от вашей задачи.
Конечно, вы можете пойти дальше чем-то вроде
double prev = -1;
{
ifstream ifs("/var/tmp/time_record.txt");
ifs >> prev;
}
if (prev < 0) prev = DEFAULT_VALUE;
...
EXPECT_GT(2 * prev, elapsedSec);
{
ofstream ofs("/var/tmp/time_record.txt");
ofs << elapsedSec << endl;
}
Но мне интересно, какая дополнительная сложность может быть оправдана...
Ответ 2
Рамка Google Test предлагает по умолчанию меру прошедшего времени. Он управляется переменной окружения, GTEST_PRINT_TIME. Эта переменная по умолчанию равна 1.
Итак, почему бы не отслеживать прошедшее время с использованием этой функции платформы Google Test plattform?
Ниже приведено слово по переменной прошедшего времени в Google Тесте.
Ответ 3
Некоторые обновления по этому вопросу (в 2016 году):
-
Здесь - хороший блог-пост Ник Бранн о его Hayai. (2012)
- Это не дает возможности указывать требования времени выполнения.
- Он очень похож на Google Test. Синтаксис и т.д.
- Он предоставляет результаты сравнительного анализа для пользователя или для структуры непрерывной интеграции. Также обратите внимание на MojaveWastelander fork для активной разработки и поддержки MSVC.
-
Google опубликовал "Benchmark" в 2014. Это обеспечивает аналогичное поведение, чем Хайяй. Насколько я понимаю, определение требований невозможно. Опять же, синтаксис вдохновлен GoogleTest.
- Существуют даже расширенные функции, такие как измерение сложности (большой-O).
-
GoogleTest имеет это как открытую функцию на Github. Существует рудиментарная реализация, но она еще не входит в состав GoogleTest.