diff --git a/.github/workflows/bvt-appleclang.yml b/.github/workflows/bvt-appleclang.yml index 3f8af46a..cc1f0504 100644 --- a/.github/workflows/bvt-appleclang.yml +++ b/.github/workflows/bvt-appleclang.yml @@ -27,7 +27,7 @@ jobs: - name: run benchmarks run: | cd build/benchmarks - ./msft_proxy_benchmarks --benchmark_repetitions=10 --benchmark_report_aggregates_only=true --benchmark_enable_random_interleaving=true --benchmark_out=benchmarking-results.json + ./msft_proxy_benchmarks --benchmark_min_warmup_time=0.1 --benchmark_min_time=0.1s --benchmark_repetitions=30 --benchmark_enable_random_interleaving=true --benchmark_report_aggregates_only=true --benchmark_format=json > benchmarking-results.json - name: archive benchmarking results uses: actions/upload-artifact@v4 diff --git a/.github/workflows/bvt-clang.yml b/.github/workflows/bvt-clang.yml index 12893cd5..fd4bbfa8 100644 --- a/.github/workflows/bvt-clang.yml +++ b/.github/workflows/bvt-clang.yml @@ -51,7 +51,7 @@ jobs: - name: run benchmarks run: | cd build-clang-18/benchmarks - ./msft_proxy_benchmarks --benchmark_repetitions=10 --benchmark_report_aggregates_only=true --benchmark_enable_random_interleaving=true --benchmark_out=benchmarking-results.json + ./msft_proxy_benchmarks --benchmark_min_warmup_time=0.1 --benchmark_min_time=0.1s --benchmark_repetitions=30 --benchmark_enable_random_interleaving=true --benchmark_report_aggregates_only=true --benchmark_format=json > benchmarking-results.json - name: archive benchmarking results uses: actions/upload-artifact@v4 diff --git a/.github/workflows/bvt-gcc.yml b/.github/workflows/bvt-gcc.yml index e66981c7..fd7115f2 100644 --- a/.github/workflows/bvt-gcc.yml +++ b/.github/workflows/bvt-gcc.yml @@ -51,7 +51,7 @@ jobs: - name: run benchmarks run: | cd build-gcc-14/benchmarks - ./msft_proxy_benchmarks --benchmark_repetitions=10 --benchmark_report_aggregates_only=true --benchmark_enable_random_interleaving=true --benchmark_out=benchmarking-results.json + ./msft_proxy_benchmarks --benchmark_min_warmup_time=0.1 --benchmark_min_time=0.1s --benchmark_repetitions=30 --benchmark_enable_random_interleaving=true --benchmark_report_aggregates_only=true --benchmark_format=json > benchmarking-results.json - name: archive benchmarking results uses: actions/upload-artifact@v4 diff --git a/.github/workflows/bvt-msvc.yml b/.github/workflows/bvt-msvc.yml index d639a7f2..0f5aecbb 100644 --- a/.github/workflows/bvt-msvc.yml +++ b/.github/workflows/bvt-msvc.yml @@ -22,7 +22,7 @@ jobs: - name: run benchmarks run: | cd build\benchmarks - .\Release\msft_proxy_benchmarks.exe --benchmark_repetitions=10 --benchmark_report_aggregates_only=true --benchmark_enable_random_interleaving=true --benchmark_out=benchmarking-results.json + .\Release\msft_proxy_benchmarks.exe --benchmark_min_warmup_time=0.1 --benchmark_min_time=0.1s --benchmark_repetitions=30 --benchmark_enable_random_interleaving=true --benchmark_report_aggregates_only=true --benchmark_format=json > benchmarking-results.json - name: archive benchmarking results uses: actions/upload-artifact@v4 diff --git a/.github/workflows/pipeline-ci.yml b/.github/workflows/pipeline-ci.yml index bae2c0a4..abe8cf2d 100644 --- a/.github/workflows/pipeline-ci.yml +++ b/.github/workflows/pipeline-ci.yml @@ -5,6 +5,7 @@ on: branches: [ main, release/** ] pull_request: branches: [ main, release/** ] + workflow_dispatch: jobs: run-bvt-gcc: diff --git a/benchmarks/proxy_invocation_benchmark.cpp b/benchmarks/proxy_invocation_benchmark.cpp index 29f85a35..b1d4ba6e 100644 --- a/benchmarks/proxy_invocation_benchmark.cpp +++ b/benchmarks/proxy_invocation_benchmark.cpp @@ -5,9 +5,12 @@ #include "proxy_invocation_benchmark_context.h" +namespace { + void BM_SmallObjectInvocationViaProxy(benchmark::State& state) { + auto data = GenerateSmallObjectInvocationProxyTestData(); for (auto _ : state) { - for (auto& p : SmallObjectInvocationProxyTestData) { + for (auto& p : data) { int result = p->Fun(); benchmark::DoNotOptimize(result); } @@ -15,8 +18,9 @@ void BM_SmallObjectInvocationViaProxy(benchmark::State& state) { } void BM_SmallObjectInvocationViaVirtualFunction(benchmark::State& state) { + auto data = GenerateSmallObjectInvocationVirtualFunctionTestData(); for (auto _ : state) { - for (auto& p : SmallObjectInvocationVirtualFunctionTestData) { + for (auto& p : data) { int result = p->Fun(); benchmark::DoNotOptimize(result); } @@ -24,8 +28,9 @@ void BM_SmallObjectInvocationViaVirtualFunction(benchmark::State& state) { } void BM_LargeObjectInvocationViaProxy(benchmark::State& state) { + auto data = GenerateLargeObjectInvocationProxyTestData(); for (auto _ : state) { - for (auto& p : LargeObjectInvocationProxyTestData) { + for (auto& p : data) { int result = p->Fun(); benchmark::DoNotOptimize(result); } @@ -33,8 +38,9 @@ void BM_LargeObjectInvocationViaProxy(benchmark::State& state) { } void BM_LargeObjectInvocationViaVirtualFunction(benchmark::State& state) { + auto data = GenerateLargeObjectInvocationVirtualFunctionTestData(); for (auto _ : state) { - for (auto& p : LargeObjectInvocationVirtualFunctionTestData) { + for (auto& p : data) { int result = p->Fun(); benchmark::DoNotOptimize(result); } @@ -45,3 +51,5 @@ BENCHMARK(BM_SmallObjectInvocationViaProxy); BENCHMARK(BM_SmallObjectInvocationViaVirtualFunction); BENCHMARK(BM_LargeObjectInvocationViaProxy); BENCHMARK(BM_LargeObjectInvocationViaVirtualFunction); + +} // namespace diff --git a/benchmarks/proxy_invocation_benchmark_context.cpp b/benchmarks/proxy_invocation_benchmark_context.cpp index c39d38c7..78ffd321 100644 --- a/benchmarks/proxy_invocation_benchmark_context.cpp +++ b/benchmarks/proxy_invocation_benchmark_context.cpp @@ -27,7 +27,7 @@ class NonIntrusiveLargeImpl { int Fun() const noexcept { return seed_ ^ (TypeSeries + 1); } private: - void* padding_[15]{}; + void* padding_[5]{}; int seed_; }; @@ -50,7 +50,7 @@ class IntrusiveLargeImpl : public InvocationTestBase { int Fun() const noexcept override { return seed_ ^ (TypeSeries + 1); } private: - void* padding_[16]{}; + void* padding_[5]{}; int seed_; }; @@ -76,18 +76,19 @@ auto GenerateTestData(const F& generator) { } // namespace -const std::vector> SmallObjectInvocationProxyTestData = GenerateTestData( - [](IntConstant, int seed) - { return pro::make_proxy>(seed); }); - -const std::vector> SmallObjectInvocationVirtualFunctionTestData = GenerateTestData( - [](IntConstant, int seed) - { return std::unique_ptr{new IntrusiveSmallImpl(seed)}; }); - -const std::vector> LargeObjectInvocationProxyTestData = GenerateTestData( - [](IntConstant, int seed) - { return pro::make_proxy>(seed); }); - -const std::vector> LargeObjectInvocationVirtualFunctionTestData = GenerateTestData( - [](IntConstant, int seed) - { return std::unique_ptr{new IntrusiveLargeImpl(seed)}; }); +std::vector> GenerateSmallObjectInvocationProxyTestData() { + return GenerateTestData([](IntConstant, int seed) + { return pro::make_proxy>(seed); }); +} +std::vector> GenerateSmallObjectInvocationVirtualFunctionTestData() { + return GenerateTestData([](IntConstant, int seed) + { return std::unique_ptr{new IntrusiveSmallImpl(seed)}; }); +} +std::vector> GenerateLargeObjectInvocationProxyTestData() { + return GenerateTestData([](IntConstant, int seed) + { return pro::make_proxy>(seed); }); +} +std::vector> GenerateLargeObjectInvocationVirtualFunctionTestData() { + return GenerateTestData([](IntConstant, int seed) + { return std::unique_ptr{new IntrusiveLargeImpl(seed)}; }); +} diff --git a/benchmarks/proxy_invocation_benchmark_context.h b/benchmarks/proxy_invocation_benchmark_context.h index 2f4bdd51..f13ee9a0 100644 --- a/benchmarks/proxy_invocation_benchmark_context.h +++ b/benchmarks/proxy_invocation_benchmark_context.h @@ -17,7 +17,7 @@ struct InvocationTestBase { virtual ~InvocationTestBase() = default; }; -extern const std::vector> SmallObjectInvocationProxyTestData; -extern const std::vector> SmallObjectInvocationVirtualFunctionTestData; -extern const std::vector> LargeObjectInvocationProxyTestData; -extern const std::vector> LargeObjectInvocationVirtualFunctionTestData; +std::vector> GenerateSmallObjectInvocationProxyTestData(); +std::vector> GenerateSmallObjectInvocationVirtualFunctionTestData(); +std::vector> GenerateLargeObjectInvocationProxyTestData(); +std::vector> GenerateLargeObjectInvocationVirtualFunctionTestData(); diff --git a/benchmarks/proxy_management_benchmark.cpp b/benchmarks/proxy_management_benchmark.cpp index 318bc52c..08056643 100644 --- a/benchmarks/proxy_management_benchmark.cpp +++ b/benchmarks/proxy_management_benchmark.cpp @@ -13,7 +13,7 @@ namespace { -constexpr int TestManagedObjectCount = 120000; +constexpr int TestManagedObjectCount = 600000; constexpr int TypeSeriesCount = 3; using SmallObject1 = int; @@ -41,8 +41,6 @@ struct PolymorphicObject : PolymorphicObjectBase { T Value; }; -} // namespace - struct DefaultFacade : pro::facade_builder ::support_copy ::build {}; @@ -207,3 +205,5 @@ BENCHMARK(BM_LargeObjectManagementWithUniquePtr); BENCHMARK(BM_LargeObjectManagementWithSharedPtr); BENCHMARK(BM_LargeObjectManagementWithSharedPtr_Pooled); BENCHMARK(BM_LargeObjectManagementWithAny); + +} // namespace