Учитывая следующий код
#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>
Итак, мои вопросы:
- Как я могу выполнить какой-то код установки только один раз перед тестом, как"std :: cout <<" Foo "<< std :: endl"? </li>
- когда я использую "state.iterations ()", я хочу получить "1, 2, 3 .." по одномуодин, но я всегда получаю 0. Как я могу получить следующий номер итераторов?
В моем реальном случае я хочу запустить некоторый код, связанный с механизмом хранения в многопоточном сценарии.шаги как это:
- открыть соединение с механизмом хранения.давайте предположим, что объект подключения CAN может быть разделен между различными потоками.
- открытый сеанс на основе подключения.давайте предположим, что сессионный объект НЕ МОЖЕТ быть разделенным между потоками.
- выполнить много операций db_related, что является единственным кодом, который я хочу тестировать.
- закрыть сеанс, соединение.
У меня есть следующий псевдокод, но я подумал, что это как минимум 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();
}
}
Проблемы:
- Должен ли я использовать здесь глобальные переменные DBConnection, чтобы к ним мог обращаться каждый поток?
- Предположим, "DBSession * session = conn.openSession ();"может быть выполнен до того, как "conn действительно настроен", и я также не хочу каждый раз тестировать openSession, как мне решить эту проблему?
Итак, у меня есть 4 вопроса в 2части, и если у вас есть больше предложений моего кода, это будет намного лучше.Спасибо!