Я хочу запустить несколько тестов с помощью библиотеки тестов Google после загрузки большого файла. Я использую следующий код для этой цели. Функция read_collection()
загружает содержимое файла, а бенчмарк Build
обрабатывает содержимое из coll
.
#define COLLECTION 'w'
class BuildFixture : public ::benchmark::Fixture {
public:
std::unique_ptr<Collection> coll;
BuildFixture() {
cout << "Constructor\n";
coll = std::make_unique<Collection>(Collection(COLLECTION));
coll->read_collection();
}
~BuildFixture() {
cout << "Destroy collection\n";
coll.reset();
}
};
BENCHMARK_DEFINE_F(BuildFixture, Build1)(benchmark::State& state) {
nrows = static_cast<size_t>(state.range(0));
for (auto _ : state) {
// Do something with coll and nrows
}
}
BENCHMARK_DEFINE_F(BuildFixture, Build2)(benchmark::State& state) {
nrows = static_cast<size_t>(state.range(0));
for (auto _ : state) {
// Something else with coll and nrows
}
}
BENCHMARK_REGISTER_F(BuildFixture, Build1)->Arg(10);
BENCHMARK_REGISTER_F(BuildFixture, Build2)->Arg(20);
BENCHMARK_MAIN();
Когда я запускаю этот код, каждый бенчмарк с аргументами 10 и 20 выполняет конструктор (в общей сложности два раза), запускает тесты и затем вызывает деструкторы. Таким образом, выходные данные выглядят как
Constructor
Constructor
.. (benchmarking outputs)..
Destroy collection
Destroy collection
В итоге это занимает слишком много времени для многократного чтения (одного и того же) файла, а также требует дополнительной памяти для хранения одних и тех же данных для нескольких тестов. Я также волнуюсь, будут ли результаты затронуты ошибками страницы. Поэтому у меня есть два вопроса:
- Есть ли способ избежать необходимости читать файл дважды, так как это сэкономило бы некоторое время выполнения (хотя это время не учитывается в тесте производительности).
- (Если нет) Как я могу реструктурировать несколько кодов тестов таким образом, чтобы каждый тест вызывал конструктор, выполнял тестирование, разрушал и затем переходил к следующему тесту? (без необходимости использовать несколько
main
функций, конечно)
Обновление 1
Тесты, которые мне нужно зарегистрировать, отличаются. Я не собираюсь передавать разные аргументы в один и тот же тест. Я обновил вопрос соответственно с Build1
и Build2
.