Настройка кода теста Google

Учитывая следующий код

#include <benchmark/benchmark.h>
#include <iostream>

static void BM_foo(benchmark::State& state) {
std::cout << "Foo "<< std::endl;
for (auto _: state) {
std::cout <<  state.iterations()  << " In loop " <<std::endl;
}
}

BENCHMARK(BM_foo);

BENCHMARK_MAIN();

Я думал, что std :: cout << «Фу»<< станд :: епсИ; будет выполнен только один раз, но во время моего теста он будет выполняться 7 раз.

Итак, мои вопросы:

  1. Как я могу запустить какой-то установочный код только один раз перед тестом, например, «std :: cout» << «Фу»<< станд :: епсИ «?
  2. когда я использую «state.iterations ()», я хочу получить «1, 2, 3 ..» один за другим, но я всегда получаю 0. Как я могу получить следующий номер итераторов?

В моем случае я хочу запустить код, связанный с механизмом хранения, в многопоточном сценарии. шаги как это:

  1. открыть соединение с хранилищем двигателя. давайте предположим, что объект подключения МОЖНО быть разделенным между различными потоками.
  2. открыть сеанс на основе соединения. давайте предположим, что объект сессии НЕ МОГУ быть разделенным между потоками.
  3. запустить много операций db_related, это единственный код, который я хочу тестировать.
  4. закрыть сеанс, соединение.

У меня есть следующий псевдокод, но я думал, что это 2 проблемы по крайней мере.

DBConnection* conn; // global variables, so that each thread can run access it.

static void BM_db_insert(benchmark::State& state) {
if (state.thread_index == 0) {
# only let 1 thread to setup the DBConnections
conn = openDBConn();
}
DBSession* session = conn.openSession();
for (auto _ : state) {
session.insertOp(id, ..);
}
session.close();
if (state.thread_index == 0) {
conn.close();
}
}

Вопросы:

  1. Должен ли я использовать глобальные переменные DBConnection, чтобы каждый поток мог получить к ним доступ?
  2. Предположим, что «DBSession * session = conn.openSession ();» может быть выполнен до того, как «conn действительно настроен», и я также не хочу каждый раз тестировать openSession, как мне решить эту проблему?

В общем, у меня есть 4 вопроса в 2 частях, и если у вас есть больше предложений по моему коду, это будет намного лучше. Спасибо!

0

Решение

  1. Мы запускаем весь бенчмарк несколько раз, чтобы найти оптимальное количество итераций для выполнения, однако эта преамбула запускается только один раз за бенчмарк. Вы делаете это правильно.

  2. Вам нужно отслеживать количество итераций самостоятельно, если вам это нужно. Однако, если вы это сделаете, то, возможно, то, что вы тестируете, не зависит от количества итераций, которое определяется динамически. Если вы хотите фиксированное количество итераций, вы должны посмотреть на State::KeepRunningBatch,


  1. Работает глобальное соединение или статический член прибора.

  2. Я бы добавил явное ожидание установления соединения в каждом потоке. Что-то подобное conn.IsReady() в цикле, прежде чем открыть сеанс.

1

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]