@@ -29,6 +29,7 @@ DECLARE_SOA_COLUMN_FULL(X, x, float, "x");
2929DECLARE_SOA_COLUMN_FULL (Y, y, float , " y" );
3030DECLARE_SOA_COLUMN_FULL (Z, z, float , " z" );
3131DECLARE_SOA_DYNAMIC_COLUMN (Sum, sum, [](float x, float y) { return x + y; });
32+ DECLARE_SOA_DYNAMIC_COLUMN (SumFreeArgs, sumFreeArgs, [](float x, float y, float freeArg) { return x + y + freeArg; });
3233} // namespace test
3334
3435DECLARE_SOA_TABLE (TestTable, " AOD" , " TESTTBL" , test::X, test::Y, test::Z, test::Sum<test::X, test::Y>);
@@ -290,6 +291,36 @@ static void BM_ASoADynamicColumnPresent(benchmark::State& state)
290291
291292BENCHMARK (BM_ASoADynamicColumnPresent)->Range(8 , 8 << maxrange);
292293
294+ static void BM_ASoADynamicColumnPresentGetGetterByLabel (benchmark::State& state)
295+ {
296+ // Seed with a real random value, if available
297+ std::default_random_engine e1 (1234567891 );
298+ std::uniform_real_distribution<float > uniform_dist (0 , 1 );
299+
300+ TableBuilder builder;
301+ auto rowWriter = builder.persist <float , float , float >({" x" , " y" , " z" });
302+ for (auto i = 0 ; i < state.range (0 ); ++i) {
303+ rowWriter (0 , uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ));
304+ }
305+ auto table = builder.finalize ();
306+
307+ using Test = o2::soa::InPlaceTable<" A/0" _h, test::X, test::Y, test::Z, test::Sum<test::X, test::Y>>;
308+
309+ for (auto _ : state) {
310+ Test tests{table};
311+ float sum = 0 ;
312+ auto xGetter = o2::soa::row_helpers::getColumnGetterByLabel<float , Test>(" x" );
313+ auto yGetter = o2::soa::row_helpers::getColumnGetterByLabel<float , Test>(" y" );
314+ for (auto & test : tests) {
315+ sum += xGetter (test) + yGetter (test);
316+ }
317+ benchmark::DoNotOptimize (sum);
318+ }
319+ state.SetBytesProcessed (state.iterations () * state.range (0 ) * sizeof (float ) * 2 );
320+ }
321+
322+ BENCHMARK (BM_ASoADynamicColumnPresentGetGetterByLabel)->Range(8 , 8 << maxrange);
323+
293324static void BM_ASoADynamicColumnCall (benchmark::State& state)
294325{
295326 // Seed with a real random value, if available
@@ -317,4 +348,33 @@ static void BM_ASoADynamicColumnCall(benchmark::State& state)
317348}
318349BENCHMARK (BM_ASoADynamicColumnCall)->Range(8 , 8 << maxrange);
319350
351+ static void BM_ASoADynamicColumnCallGetGetterByLabel (benchmark::State& state)
352+ {
353+ // Seed with a real random value, if available
354+ std::default_random_engine e1 (1234567891 );
355+ std::uniform_real_distribution<float > uniform_dist (0 , 1 );
356+
357+ TableBuilder builder;
358+ auto rowWriter = builder.persist <float , float , float >({" x" , " y" , " z" });
359+ for (auto i = 0 ; i < state.range (0 ); ++i) {
360+ rowWriter (0 , uniform_dist (e1 ), uniform_dist (e1 ), uniform_dist (e1 ));
361+ }
362+ auto table = builder.finalize ();
363+
364+ // SumFreeArgs presence checks if dynamic columns get() is handled correctly during compilation
365+ using Test = o2::soa::InPlaceTable<" A/0" _h, test::X, test::Y, test::Sum<test::X, test::Y>, test::SumFreeArgs<test::X, test::Y>>;
366+
367+ Test tests{table};
368+ for (auto _ : state) {
369+ float sum = 0 ;
370+ auto sumGetter = o2::soa::row_helpers::getColumnGetterByLabel<float , Test>(" Sum" );
371+ for (auto & test : tests) {
372+ sum += sumGetter (test);
373+ }
374+ benchmark::DoNotOptimize (sum);
375+ }
376+ state.SetBytesProcessed (state.iterations () * state.range (0 ) * sizeof (float ) * 2 );
377+ }
378+ BENCHMARK (BM_ASoADynamicColumnCallGetGetterByLabel)->Range(8 , 8 << maxrange);
379+
320380BENCHMARK_MAIN ();
0 commit comments