SingleInstanceOverrideBenchmarks.cpp 5.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109
  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. #if defined(HAVE_BENCHMARK)
  9. #include <Prefab/Benchmark/Propagation/SingleInstanceOverrideBenchmarks.h>
  10. #define REGISTER_OVERRIDE_INSTANCE_BENCHMARK(BaseClass, Method) \
  11. BENCHMARK_REGISTER_F(BaseClass, Method) \
  12. ->Args({ 1, 500 }) \
  13. ->Args({ 1, 5000 }) \
  14. ->Args({ 10, 100 }) \
  15. ->Args({ 10, 1000 }) \
  16. ->Args({ 50, 20 }) \
  17. ->Args({ 50, 200 }) \
  18. ->ArgNames({ "DepthOfNesting", "EntitiesInEachPrefab" }) \
  19. ->Unit(benchmark::kMillisecond);
  20. namespace Benchmark
  21. {
  22. using namespace AzToolsFramework::Prefab;
  23. void SingleInstanceOverrideBenchmarks::SetupHarness(const benchmark::State& state)
  24. {
  25. BM_Prefab::SetupHarness(state);
  26. const unsigned int depthOfNesting = static_cast<unsigned int>(state.range(0));
  27. const unsigned int entitiesCountInEachPrefab = static_cast<unsigned int>(state.range(1));
  28. CreateFakePaths(depthOfNesting + 1); // The +1 is for the path of parent prefab
  29. const auto& parentTemplatePath = m_paths.back();
  30. const auto& templateToOverridePath = m_paths.front();
  31. // Create the prefab instance that will act as the leaf instance that we will be overriding.
  32. AZStd::vector<AZ::Entity*> entitiesInNestedPrefab = GetEntitiesToPutInNestedInstance(entitiesCountInEachPrefab);
  33. m_entityToModify = CreateEntity("Entity", AZ::EntityId());
  34. entitiesInNestedPrefab.emplace_back(m_entityToModify);
  35. AZStd::unique_ptr<Instance> nestedInstance = m_prefabSystemComponent->CreatePrefab(entitiesInNestedPrefab, {}, templateToOverridePath);
  36. m_instanceToModify = nestedInstance.get();
  37. for (unsigned int nestedInstanceCounter = 1; nestedInstanceCounter < depthOfNesting; nestedInstanceCounter++)
  38. {
  39. nestedInstance = m_prefabSystemComponent->CreatePrefab(
  40. GetEntitiesToPutInNestedInstance(entitiesCountInEachPrefab), MakeInstanceList(AZStd::move(nestedInstance)),
  41. m_paths[nestedInstanceCounter]);
  42. }
  43. m_instanceCreated = m_prefabSystemComponent->CreatePrefab(
  44. GetEntitiesToPutInNestedInstance(entitiesCountInEachPrefab), MakeInstanceList(AZStd::move(nestedInstance)), parentTemplatePath);
  45. // We need 2 prefab instances: One to make the original change to; And one to propagate that change to.
  46. m_instanceToUseForPropagation = m_prefabSystemComponent->InstantiatePrefab(m_instanceCreated->GetTemplateId());
  47. }
  48. void SingleInstanceOverrideBenchmarks::TeardownHarness(const benchmark::State& state)
  49. {
  50. m_instanceCreated.reset();
  51. m_instanceToUseForPropagation.reset();
  52. BM_Prefab::TeardownHarness(state);
  53. }
  54. AZStd::vector<AZ::Entity*> SingleInstanceOverrideBenchmarks::GetEntitiesToPutInNestedInstance(const unsigned int entityCount)
  55. {
  56. AZStd::vector<AZ::Entity*> entitiesInNestedInstance;
  57. entitiesInNestedInstance.reserve(entityCount);
  58. for (unsigned int entityCounter = 0; entityCounter < entityCount; entityCounter++)
  59. {
  60. entitiesInNestedInstance.emplace_back(CreateEntity("Entity"));
  61. }
  62. return AZStd::move(entitiesInNestedInstance);
  63. }
  64. BENCHMARK_DEFINE_F(SingleInstanceOverrideBenchmarks, PropagateOverrideComponent)(benchmark::State& state)
  65. {
  66. UpdateComponent(state);
  67. }
  68. REGISTER_OVERRIDE_INSTANCE_BENCHMARK(SingleInstanceOverrideBenchmarks, PropagateOverrideComponent);
  69. BENCHMARK_DEFINE_F(SingleInstanceOverrideBenchmarks, PropagateOverrideAddComponent)(benchmark::State& state)
  70. {
  71. AddComponent(state);
  72. }
  73. REGISTER_OVERRIDE_INSTANCE_BENCHMARK(SingleInstanceOverrideBenchmarks, PropagateOverrideAddComponent);
  74. BENCHMARK_DEFINE_F(SingleInstanceOverrideBenchmarks, PropagateOverrideRemoveComponent)(benchmark::State& state)
  75. {
  76. RemoveComponent(state);
  77. }
  78. REGISTER_OVERRIDE_INSTANCE_BENCHMARK(SingleInstanceOverrideBenchmarks, PropagateOverrideRemoveComponent);
  79. BENCHMARK_DEFINE_F(SingleInstanceOverrideBenchmarks, PropagateOverrideAddEntity)(benchmark::State& state)
  80. {
  81. AddEntity(state);
  82. }
  83. REGISTER_OVERRIDE_INSTANCE_BENCHMARK(SingleInstanceOverrideBenchmarks, PropagateOverrideAddEntity);
  84. BENCHMARK_DEFINE_F(SingleInstanceOverrideBenchmarks, PropagateOverrideRemoveEntity)(benchmark::State& state)
  85. {
  86. RemoveEntity(state);
  87. }
  88. REGISTER_OVERRIDE_INSTANCE_BENCHMARK(SingleInstanceOverrideBenchmarks, PropagateOverrideRemoveEntity);
  89. } // namespace Benchmark
  90. #endif