Настройка кода теста Google - PullRequest
0 голосов
/ 19 мая 2018

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

#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 << "Foo" << std :: endl;будет выполнен только один раз, но во время моего теста он будет выполнен 7 раз. </p>

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

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

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

  1. открыть соединение с механизмом хранения.давайте предположим, что объект подключения CAN может быть разделен между различными потоками.
  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части, и если у вас есть больше предложений моего кода, это будет намного лучше.Спасибо!

1 Ответ

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

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


  1. Наличие глобальной связи или статического члена прибора.

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

...