Учитывая следующий код
#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 раз.
Итак, мои вопросы:
В моем случае я хочу запустить код, связанный с механизмом хранения, в многопоточном сценарии. шаги как это:
У меня есть следующий псевдокод, но я думал, что это 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();
}
}
Вопросы:
В общем, у меня есть 4 вопроса в 2 частях, и если у вас есть больше предложений по моему коду, это будет намного лучше. Спасибо!
Мы запускаем весь бенчмарк несколько раз, чтобы найти оптимальное количество итераций для выполнения, однако эта преамбула запускается только один раз за бенчмарк. Вы делаете это правильно.
Вам нужно отслеживать количество итераций самостоятельно, если вам это нужно. Однако, если вы это сделаете, то, возможно, то, что вы тестируете, не зависит от количества итераций, которое определяется динамически. Если вы хотите фиксированное количество итераций, вы должны посмотреть на State::KeepRunningBatch
,
Работает глобальное соединение или статический член прибора.
Я бы добавил явное ожидание установления соединения в каждом потоке. Что-то подобное conn.IsReady()
в цикле, прежде чем открыть сеанс.
Других решений пока нет …