Подтвердить что ты не робот

Бенчмаркинг с 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% будет необычным).

Я открыт для предложений здесь, но было бы неплохо провести проверку с низким уровнем обслуживания, которая будет работать с автоматическим тестированием, поэтому будет очевидно, что система внезапно стала медленной, даже если все выходы выглядят нормально.

4b9b3361

Ответ 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.