PrefabCreateBenchmarks.cpp 5.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184
  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/PrefabBenchmarkFixture.h>
  10. namespace Benchmark
  11. {
  12. using BM_PrefabCreate = BM_Prefab;
  13. using namespace AzToolsFramework::Prefab;
  14. BENCHMARK_DEFINE_F(BM_PrefabCreate, CreatePrefabs_SingleEntityEach)(::benchmark::State& state)
  15. {
  16. const unsigned int numEntities = static_cast<unsigned int>(state.range());
  17. const unsigned int numInstances = numEntities;
  18. CreateFakePaths(numInstances);
  19. for ([[maybe_unused]] auto _ : state)
  20. {
  21. state.PauseTiming();
  22. AZStd::vector<AZ::Entity*> entities;
  23. CreateEntities(numEntities, entities);
  24. AZStd::vector<AZStd::unique_ptr<Instance>> newInstances;
  25. state.ResumeTiming();
  26. for (unsigned int instanceCounter = 0; instanceCounter < numInstances; ++instanceCounter)
  27. {
  28. newInstances.push_back(m_prefabSystemComponent->CreatePrefab(
  29. { entities[instanceCounter] },
  30. {},
  31. m_paths[instanceCounter]));
  32. }
  33. state.PauseTiming();
  34. newInstances.clear();
  35. ResetPrefabSystem();
  36. state.ResumeTiming();
  37. }
  38. state.SetComplexityN(numInstances);
  39. }
  40. BENCHMARK_REGISTER_F(BM_PrefabCreate, CreatePrefabs_SingleEntityEach)
  41. ->RangeMultiplier(10)
  42. ->Range(100, 10000)
  43. ->Unit(benchmark::kMillisecond)
  44. ->Complexity();
  45. BENCHMARK_DEFINE_F(BM_PrefabCreate, CreatePrefab_FromEntities)(::benchmark::State& state)
  46. {
  47. const unsigned int numEntities = static_cast<unsigned int>(state.range());
  48. for ([[maybe_unused]] auto _ : state)
  49. {
  50. state.PauseTiming();
  51. AZStd::vector<AZ::Entity*> entities;
  52. CreateEntities(numEntities, entities);
  53. state.ResumeTiming();
  54. AZStd::unique_ptr<Instance> instance = m_prefabSystemComponent->CreatePrefab(
  55. entities
  56. , {}
  57. , m_pathString);
  58. state.PauseTiming();
  59. instance.reset();
  60. ResetPrefabSystem();
  61. state.ResumeTiming();
  62. }
  63. state.SetComplexityN(numEntities);
  64. }
  65. BENCHMARK_REGISTER_F(BM_PrefabCreate, CreatePrefab_FromEntities)
  66. ->RangeMultiplier(10)
  67. ->Range(100, 10000)
  68. ->Unit(benchmark::kMillisecond)
  69. ->Complexity();
  70. BENCHMARK_DEFINE_F(BM_PrefabCreate, CreatePrefab_FromSingleDepthInstances)(::benchmark::State& state)
  71. {
  72. const unsigned int numInstancesToAdd = static_cast<unsigned int>(state.range());
  73. const unsigned int numEntities = numInstancesToAdd;
  74. // Create fake paths for all the nested instances
  75. // plus the instance receiving them
  76. CreateFakePaths(numInstancesToAdd + 1);
  77. for ([[maybe_unused]] auto _ : state)
  78. {
  79. state.PauseTiming();
  80. AZStd::vector<AZ::Entity*> entities;
  81. CreateEntities(numEntities, entities);
  82. AZStd::vector<AZStd::unique_ptr<Instance>> testInstances;
  83. testInstances.resize(numInstancesToAdd);
  84. for (unsigned int instanceCounter = 0; instanceCounter < numInstancesToAdd; ++instanceCounter)
  85. {
  86. testInstances[instanceCounter] = (m_prefabSystemComponent->CreatePrefab(
  87. { entities[instanceCounter] }
  88. , {}
  89. , m_paths[instanceCounter]));
  90. }
  91. state.ResumeTiming();
  92. AZStd::unique_ptr<Instance> nestedInstance = m_prefabSystemComponent->CreatePrefab(
  93. {}
  94. , AZStd::move(testInstances)
  95. , m_paths.back());
  96. state.PauseTiming();
  97. nestedInstance.reset();
  98. ResetPrefabSystem();
  99. state.ResumeTiming();
  100. }
  101. state.SetComplexityN(numInstancesToAdd);
  102. }
  103. BENCHMARK_REGISTER_F(BM_PrefabCreate, CreatePrefab_FromSingleDepthInstances)
  104. ->RangeMultiplier(10)
  105. ->Range(100, 10000)
  106. ->Unit(benchmark::kMillisecond)
  107. ->Complexity();
  108. BENCHMARK_DEFINE_F(BM_PrefabCreate, CreatePrefab_FromLinearNestingOfInstances)(::benchmark::State& state)
  109. {
  110. const unsigned int numInstances = static_cast<unsigned int>(state.range());
  111. // Create fake paths for all the nested instances
  112. // plus the root instance
  113. CreateFakePaths(numInstances + 1);
  114. for ([[maybe_unused]] auto _ : state)
  115. {
  116. state.PauseTiming();
  117. AZStd::unique_ptr<Instance> nestedInstanceRoot = m_prefabSystemComponent->CreatePrefab(
  118. { CreateEntity("Entity1") },
  119. {},
  120. m_paths.back());
  121. state.ResumeTiming();
  122. for (unsigned int instanceCounter = 0; instanceCounter < numInstances; ++instanceCounter)
  123. {
  124. nestedInstanceRoot = m_prefabSystemComponent->CreatePrefab(
  125. {},
  126. MakeInstanceList(AZStd::move(nestedInstanceRoot)),
  127. m_paths[instanceCounter]);
  128. }
  129. state.PauseTiming();
  130. nestedInstanceRoot.reset();
  131. ResetPrefabSystem();
  132. state.ResumeTiming();
  133. }
  134. state.SetComplexityN(numInstances);
  135. }
  136. }
  137. #endif