SingleInstanceMultipleNestedInstancesBenchmarks.cpp 6.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123
  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/SingleInstanceMultipleNestedInstancesBenchmarks.h>
  10. #define REGISTER_MULTIPLE_NESTED_INSTANCES_BENCHMARK(BaseClass, Method) \
  11. BENCHMARK_REGISTER_F(BaseClass, Method) \
  12. ->Args({ 10, 100 }) \
  13. ->Args({ 100, 10 }) \
  14. ->Args({ 10, 1000 }) \
  15. ->Args({ 1000, 10 }) \
  16. ->Args({ 1, 10000 }) \
  17. ->Args({ 10000, 1 }) \
  18. ->ArgNames({ "NestedPrefabs", "EntitiesInEachNestedPrefab" }) \
  19. ->Unit(benchmark::kMillisecond);
  20. namespace Benchmark
  21. {
  22. using namespace AzToolsFramework::Prefab;
  23. void SingleInstanceMultipleNestedInstancesBenchmarks::SetupHarness(const benchmark::State& state)
  24. {
  25. BM_Prefab::SetupHarness(state);
  26. CreateFakePaths(2);
  27. const auto& parentTemplatePath = m_paths.front();
  28. const auto& nestedTemplatePath = m_paths.back();
  29. const unsigned int nestedPrefabsCount = static_cast<unsigned int>(state.range(0));
  30. const unsigned int entitiesCountInNestedPrefab = static_cast<unsigned int>(state.range(1));
  31. AZStd::vector<AZ::Entity*> entitiesInParentInstance;
  32. AZStd::vector<AZStd::unique_ptr<Instance>> nestedInstances;
  33. nestedInstances.reserve(nestedPrefabsCount);
  34. AZStd::vector<AZ::Entity*> entitiesInNestedInstance;
  35. entitiesInNestedInstance.reserve(entitiesCountInNestedPrefab);
  36. for (unsigned int entityCounter = 0; entityCounter < entitiesCountInNestedPrefab; entityCounter++)
  37. {
  38. entitiesInNestedInstance.emplace_back(CreateEntity("Entity"));
  39. }
  40. AZStd::unique_ptr<Instance> nestedInstance =
  41. m_prefabSystemComponent->CreatePrefab(entitiesInNestedInstance, {}, nestedTemplatePath);
  42. m_nestedPrefabTemplateId = nestedInstance->GetTemplateId();
  43. nestedInstance.reset();
  44. for (unsigned int nestedInstanceCounter = 0; nestedInstanceCounter < nestedPrefabsCount; nestedInstanceCounter++)
  45. {
  46. nestedInstances.emplace_back(AZStd::move(m_prefabSystemComponent->InstantiatePrefab(m_nestedPrefabTemplateId)));
  47. }
  48. m_entityToModify = CreateEntity("Entity", AZ::EntityId());
  49. entitiesInParentInstance.emplace_back(m_entityToModify);
  50. m_instanceCreated =
  51. m_prefabSystemComponent->CreatePrefab(entitiesInParentInstance, AZStd::move(nestedInstances), parentTemplatePath);
  52. TemplateId templateToInstantiateId = m_instanceCreated->GetTemplateId();
  53. m_instanceToModify = m_instanceCreated.get();
  54. // We need 2 prefab instances: One to make the original change to; And one to propagate that change to.
  55. m_instanceToUseForPropagation = m_prefabSystemComponent->InstantiatePrefab(templateToInstantiateId);
  56. }
  57. void SingleInstanceMultipleNestedInstancesBenchmarks::TeardownHarness(const benchmark::State& state)
  58. {
  59. m_instanceCreated.reset();
  60. m_instanceToUseForPropagation.reset();
  61. BM_Prefab::TeardownHarness(state);
  62. }
  63. BENCHMARK_DEFINE_F(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateUpdateComponentChange)(benchmark::State& state)
  64. {
  65. UpdateComponent(state);
  66. }
  67. REGISTER_MULTIPLE_NESTED_INSTANCES_BENCHMARK(
  68. SingleInstanceMultipleNestedInstancesBenchmarks, PropagateUpdateComponentChange);
  69. BENCHMARK_DEFINE_F(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateAddComponentChange)(benchmark::State& state)
  70. {
  71. AddComponent(state);
  72. }
  73. REGISTER_MULTIPLE_NESTED_INSTANCES_BENCHMARK(
  74. SingleInstanceMultipleNestedInstancesBenchmarks, PropagateAddComponentChange);
  75. BENCHMARK_DEFINE_F(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateRemoveComponentChange)(benchmark::State& state)
  76. {
  77. RemoveComponent(state);
  78. }
  79. REGISTER_MULTIPLE_NESTED_INSTANCES_BENCHMARK(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateRemoveComponentChange);
  80. BENCHMARK_DEFINE_F(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateAddEntityChange)(benchmark::State& state)
  81. {
  82. AddEntity(state);
  83. }
  84. REGISTER_MULTIPLE_NESTED_INSTANCES_BENCHMARK(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateAddEntityChange);
  85. BENCHMARK_DEFINE_F(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateRemoveEntityChange)(benchmark::State& state)
  86. {
  87. RemoveEntity(state);
  88. }
  89. REGISTER_MULTIPLE_NESTED_INSTANCES_BENCHMARK(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateRemoveEntityChange);
  90. BENCHMARK_DEFINE_F(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateAddNestedPrefabChange)(benchmark::State& state)
  91. {
  92. AddNestedInstance(state, m_nestedPrefabTemplateId);
  93. }
  94. REGISTER_MULTIPLE_NESTED_INSTANCES_BENCHMARK(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateAddNestedPrefabChange);
  95. BENCHMARK_DEFINE_F(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateRemoveNestedPrefabChange)(benchmark::State& state)
  96. {
  97. RemoveNestedInstance(state, m_nestedPrefabTemplateId);
  98. }
  99. REGISTER_MULTIPLE_NESTED_INSTANCES_BENCHMARK(SingleInstanceMultipleNestedInstancesBenchmarks, PropagateRemoveNestedPrefabChange);
  100. } // namespace Benchmark
  101. #endif