DomPrefixTreeBenchmarks.cpp 4.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124
  1. /*
  2. * Copyright (c) Contributors to the Open 3D Engine Project.
  3. * For complete copyright and license terms please see the LICENSE at the root of this distribution.
  4. *
  5. * SPDX-License-Identifier: Apache-2.0 OR MIT
  6. *
  7. */
  8. #include <Tests/DOM/DomFixtures.h>
  9. #include <AzCore/DOM/DomPrefixTree.h>
  10. #define REGISTER_TREE_BENCHMARK(BaseClass, Method) \
  11. BENCHMARK_REGISTER_F(BaseClass, Method)->Args({10, 1})->Args({1000, 1})->Args({10, 5})->Args({1000, 5})
  12. namespace AZ::Dom::Benchmark
  13. {
  14. class DomPrefixTreeBenchmark : public Tests::DomBenchmarkFixture
  15. {
  16. public:
  17. void SetUpHarness() override
  18. {
  19. Tests::DomBenchmarkFixture::SetUpHarness();
  20. m_registeredPaths = AZStd::make_unique<AZStd::vector<Path>>();
  21. }
  22. void TearDownHarness() override
  23. {
  24. m_registeredPaths.reset();
  25. m_tree.Clear();
  26. Tests::DomBenchmarkFixture::TearDownHarness();
  27. }
  28. void SetupTree(benchmark::State& state)
  29. {
  30. const size_t numPaths = aznumeric_cast<size_t>(state.range(0));
  31. const size_t depth = aznumeric_cast<size_t>(state.range(1));
  32. Path path("/root");
  33. for (size_t i = 0; i < numPaths; ++i)
  34. {
  35. for (size_t c = 0; c < depth; ++c)
  36. {
  37. path.Push(i % 4);
  38. m_tree.SetValue(path, AZStd::string::format("entry%zu", i));
  39. m_registeredPaths->push_back(path);
  40. }
  41. for (size_t c = 0; c < depth; ++c)
  42. {
  43. path.Pop();
  44. }
  45. }
  46. }
  47. DomPrefixTree<AZStd::string> m_tree;
  48. AZStd::unique_ptr<AZStd::vector<Path>> m_registeredPaths;
  49. };
  50. BENCHMARK_DEFINE_F(DomPrefixTreeBenchmark, FindValue_ExactPath)(benchmark::State& state)
  51. {
  52. SetupTree(state);
  53. for ([[maybe_unused]] auto _ : state)
  54. {
  55. for (const auto& pathToCheck : *m_registeredPaths)
  56. {
  57. benchmark::DoNotOptimize(m_tree.ValueAtPath(pathToCheck, PrefixTreeMatch::ExactPath));
  58. }
  59. }
  60. state.SetItemsProcessed(m_registeredPaths->size() * state.iterations());
  61. }
  62. REGISTER_TREE_BENCHMARK(DomPrefixTreeBenchmark, FindValue_ExactPath);
  63. BENCHMARK_DEFINE_F(DomPrefixTreeBenchmark, FindValue_InexactPath)(benchmark::State& state)
  64. {
  65. SetupTree(state);
  66. for ([[maybe_unused]] auto _ : state)
  67. {
  68. for (const auto& pathToCheck : *m_registeredPaths)
  69. {
  70. benchmark::DoNotOptimize(m_tree.ValueAtPath(pathToCheck, PrefixTreeMatch::PathAndParents));
  71. }
  72. }
  73. state.SetItemsProcessed(m_registeredPaths->size() * state.iterations());
  74. }
  75. REGISTER_TREE_BENCHMARK(DomPrefixTreeBenchmark, FindValue_InexactPath);
  76. BENCHMARK_DEFINE_F(DomPrefixTreeBenchmark, FindValue_VisitEntries_LeastToMostSpecific)(benchmark::State& state)
  77. {
  78. SetupTree(state);
  79. for ([[maybe_unused]] auto _ : state)
  80. {
  81. m_tree.VisitPath(Path(), [](const Path& path, const AZStd::string& value)
  82. {
  83. benchmark::DoNotOptimize(path);
  84. benchmark::DoNotOptimize(value);
  85. return true;
  86. });
  87. }
  88. state.SetItemsProcessed(m_registeredPaths->size() * state.iterations());
  89. }
  90. REGISTER_TREE_BENCHMARK(DomPrefixTreeBenchmark, FindValue_VisitEntries_LeastToMostSpecific);
  91. BENCHMARK_DEFINE_F(DomPrefixTreeBenchmark, FindValue_VisitEntries_MostToLeastSpecific)(benchmark::State& state)
  92. {
  93. SetupTree(state);
  94. for ([[maybe_unused]] auto _ : state)
  95. {
  96. m_tree.VisitPath(
  97. Path(),
  98. [](const Path& path, const AZStd::string& value)
  99. {
  100. benchmark::DoNotOptimize(path);
  101. benchmark::DoNotOptimize(value);
  102. return true;
  103. }, PrefixTreeTraversalFlags::TraverseMostToLeastSpecific);
  104. }
  105. state.SetItemsProcessed(m_registeredPaths->size() * state.iterations());
  106. }
  107. REGISTER_TREE_BENCHMARK(DomPrefixTreeBenchmark, FindValue_VisitEntries_MostToLeastSpecific);
  108. }
  109. #undef REGISTER_TREE_BENCHMARK