public void SetSharedComponentDataPerformanceTest() { var archetype = m_Manager.CreateArchetype(typeof(TestData1), typeof(TestShared1), typeof(TestShared2)); var setSharedComponentData = new SampleGroupDefinition("SetSharedComponentData"); NativeArray <Entity> entities = new NativeArray <Entity>(16384, Allocator.Temp); Measure.Method(() => { for (int i = 0; i < entities.Length; ++i) { m_Manager.SetSharedComponentData(entities[i], new TestShared1 { value = i & 0x003F }); m_Manager.SetSharedComponentData(entities[i], new TestShared2 { value = i & 0x0FC0 }); } }) .SetUp(() => { m_Manager.CreateEntity(archetype, entities); }) .CleanUp(() => { m_Manager.DestroyEntity(entities); }).Run(); entities.Dispose(); }
private void UpdateSampleGroupDefinition() { if (m_Definition.Name == null) { m_Definition = new SampleGroupDefinition("Time"); } }
public void AddComponentPerformanceTest() { var archetype = m_Manager.CreateArchetype(typeof(TestData1), typeof(TestShared1), typeof(TestShared2)); var addComponent = new SampleGroupDefinition("AddComponent"); Measure.Method(() => { NativeArray <Entity> entities = new NativeArray <Entity>(16384, Allocator.Temp); m_Manager.CreateEntity(archetype, entities); for (int i = 0; i < entities.Length; ++i) { m_Manager.SetSharedComponentData(entities[i], new TestShared1 { value = i & 0x003F }); m_Manager.SetSharedComponentData(entities[i], new TestShared2 { value = i & 0x0FC0 }); } using (Measure.Scope(addComponent)) { for (int i = 0; i < entities.Length; ++i) { m_Manager.AddComponentData(entities[i], new TestData2()); } } m_Manager.DestroyEntity(entities); entities.Dispose(); }).Run(); }
public void Measure_Empty() { var allocated = new SampleGroupDefinition("TotalAllocatedMemory", SampleUnit.Megabyte); var reserved = new SampleGroupDefinition("TotalReservedMemory", SampleUnit.Megabyte); Measure.Custom(allocated, Profiler.GetTotalAllocatedMemoryLong() / 1048576f); Measure.Custom(reserved, Profiler.GetTotalReservedMemoryLong() / 1048576f); }
private void EndGCRecorderAndMeasure(int iterations) { m_GCRecorder.enabled = false; var definiton = new SampleGroupDefinition(m_Definition.Name + ".GC()", SampleUnit.None); Measure.Custom(definiton, m_GCRecorder.sampleBlockCount / iterations); }
public void StackArrayTest() { var allocated = new SampleGroupDefinition("TotalAllocatedMemory", SampleUnit.Megabyte); var reserved = new SampleGroupDefinition("TotalReservedMemory", SampleUnit.Megabyte); var mem1 = UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong(); var mem2 = UnityEngine.Profiling.Profiler.GetTotalReservedMemoryLong(); Unity.PerformanceTesting.Measure.Method(() => { ME.ECS.Collections.StackArray <TestStruct> arr2; var arr = new ME.ECS.Collections.StackArray <TestStruct>(1000); for (int i = 0; i < arr.Length; ++i) { arr[i] = new TestStruct() { data = i }; } arr2 = arr; arr[0] = new TestStruct() { data = 10 }; for (int i = 0; i < arr.Length; ++i) { Assert.True(i == arr2[i].data); } Assert.True(10 == arr[0].data); }).WarmupCount(100) .MeasurementCount(100) .IterationsPerMeasurement(5) .GC() .Definition(sampleUnit: Unity.PerformanceTesting.SampleUnit.Microsecond) .Run(); Assert.That(() => { ME.ECS.Collections.StackArray <TestStruct> arr2; var arr = new ME.ECS.Collections.StackArray <TestStruct>(1000); for (int i = 0; i < arr.Length; ++i) { arr[i] = new TestStruct() { data = i }; } arr2 = arr; arr[0] = new TestStruct() { data = 10 }; }, Is.Not.AllocatingGCMemory()); Measure.Custom(allocated, (UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong() - mem1) / 1048576f); Measure.Custom(reserved, (UnityEngine.Profiling.Profiler.GetTotalReservedMemoryLong() - mem2) / 1048576f); }
public void ZeroSampleGroups_Highlighted_MultipleSamples() { var sgd = new SampleGroupDefinition("TEST"); Measure.Custom(sgd, 0); Measure.Custom(sgd, 0); Measure.Custom(sgd, 0); Measure.Custom(sgd, 0); }
private static void AssertDefinition(SampleGroupDefinition definition, string name, SampleUnit sampleUnit, AggregationType aggregationType, double percentile, double threshhold, bool increaseIsBetter) { Assert.AreEqual(definition.Name, name); Assert.AreEqual(definition.SampleUnit, sampleUnit); Assert.AreEqual(definition.AggregationType, aggregationType); Assert.AreEqual(definition.Percentile, percentile); Assert.AreEqual(definition.Threshold, threshhold, 0.001D); Assert.AreEqual(definition.IncreaseIsBetter, increaseIsBetter); }
public FramesMeasurement ProfilerMarkers(params string[] profilerMarkerNames) { var definitions = new SampleGroupDefinition[profilerMarkerNames.Length]; for (int i = 0; i < profilerMarkerNames.Length; i++) { definitions[i] = new SampleGroupDefinition(profilerMarkerNames[i]); } m_ProfilerDefinitions = definitions; return(this); }
public ScopedFrameTimeMeasurement(SampleGroupDefinition sampleGroupDefinition) { var go = new GameObject("Recorder"); if (Application.isPlaying) { Object.DontDestroyOnLoad(go); } m_Test = go.AddComponent <FrameTimeMeasurement>(); m_Test.SampleGroupDefinition = sampleGroupDefinition; PerformanceTest.Disposables.Add(this); }
private void UpdateSampleGroupDefinition() { if (m_Definition.Name == null) { m_Definition = new SampleGroupDefinition("Time"); } if (m_ProfilerDefinitions == null) { m_ProfilerDefinitions = new SampleGroupDefinition[0]; } }
public MethodMeasurement ProfilerMarkers(params string[] profilerMarkerNames) { if (profilerMarkerNames == null) { return(this); } var definitions = new SampleGroupDefinition[profilerMarkerNames.Length]; for (var i = 0; i < profilerMarkerNames.Length; i++) { definitions[i] = new SampleGroupDefinition(profilerMarkerNames[i]); } AddProfilerMarkers(definitions); return(this); }
public void StackArrayTestCompare() { var allocated = new SampleGroupDefinition("TotalAllocatedMemory", SampleUnit.Megabyte); var reserved = new SampleGroupDefinition("TotalReservedMemory", SampleUnit.Megabyte); var mem1 = UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong(); var mem2 = UnityEngine.Profiling.Profiler.GetTotalReservedMemoryLong(); Unity.PerformanceTesting.Measure.Method(() => { var arr = new TestStruct[1000]; for (int i = 0; i < arr.Length; ++i) { arr[i] = new TestStruct() { data = i }; } var arr2 = new TestStruct[1000]; System.Array.Copy(arr, arr2, arr.Length); arr[0] = new TestStruct() { data = 10 }; for (int i = 0; i < arr.Length; ++i) { Assert.True(i == arr2[i].data); } Assert.True(10 == arr[0].data); }).WarmupCount(100) .MeasurementCount(100) .IterationsPerMeasurement(5) .GC() .Definition(sampleUnit: Unity.PerformanceTesting.SampleUnit.Microsecond) .Run(); Measure.Custom(allocated, (UnityEngine.Profiling.Profiler.GetTotalAllocatedMemoryLong() - mem1) / 1048576f); Measure.Custom(reserved, (UnityEngine.Profiling.Profiler.GetTotalReservedMemoryLong() - mem2) / 1048576f); }
public void BuildTree([Values(10, 100, 1000, 25000)] int items, [Values(10, 100, 1000, 25000)] int extents) { var system = base.m_World.GetOrCreateSystem <OctreeTestSystem>(); system.DebugLogging = false; var systemOriginal = base.m_World.GetOrCreateSystem <OctreeTestSystem2>(); systemOriginal.DebugLogging = false; var measurements = 25; var warmups = 5; var group = new SampleGroupDefinition { AggregationType = AggregationType.Average, Name = $"BuildTree, Items:{items} Extents:{extents}", SampleUnit = SampleUnit.Millisecond }; var groupOriginal = new SampleGroupDefinition { AggregationType = AggregationType.Average, Name = $"BuildTree.Original, Items:{items} Extents:{extents}", SampleUnit = SampleUnit.Millisecond }; for (int i = 0; i < measurements; i++) { if (i < warmups) { var bounds = new AABB { Center = 0, Extents = extents }; var tree = new NativeOctree <int>(bounds, Allocator.Temp); var treeOriginal = new NativeOctree_Original <int>(bounds, Allocator.Temp); var elements = new NativeArray <OctElement <int> >(items, Allocator.Temp); system.Build(tree, elements); systemOriginal.Build(treeOriginal, elements); } else { var bounds = new AABB { Center = 0, Extents = extents }; var tree = new NativeOctree <int>(bounds, Allocator.Temp); var elements = new NativeArray <OctElement <int> >(items, Allocator.Temp); for (int j = 0; j < items; j++) { elements[j] = new OctElement <int> { pos = new float3(Random.insideUnitSphere * extents), element = j }; } system.Build(tree, elements); Measure.Custom(group, system.BuildStopWatch.Elapsed.TotalMilliseconds); bounds = new AABB { Center = 0, Extents = extents }; var treeOriginal = new NativeOctree_Original <int>(bounds, Allocator.Temp); elements = new NativeArray <OctElement <int> >(items, Allocator.Temp); for (int j = 0; j < items; j++) { elements[j] = new OctElement <int> { pos = new float3(Random.insideUnitSphere * extents), element = j }; } systemOriginal.Build(treeOriginal, elements); Measure.Custom(groupOriginal, systemOriginal.BuildStopWatch.Elapsed.TotalMilliseconds); Debug.Log($"NativeOctree.ClearAndBulkInsert Original={systemOriginal.BuildStopWatch.Elapsed.TotalMilliseconds:N4}ms Modified={system.BuildStopWatch.Elapsed.TotalMilliseconds:N4}ms"); } } }
public void RangeQuery([Values(10, 100, 1000, 10000)] int items, [Values(10, 100, 1000, 10000)] int extents, [Values(true, false)] bool resultResize, [Values(0.01f, 0.1f, 0.25f, 0.5f, 1.1f)] float queryBounds, [Values(RangeQueryTargetAreaPosition.Centered, RangeQueryTargetAreaPosition.Random)] RangeQueryTargetAreaPosition targetPosition) { var system = base.m_World.GetOrCreateSystem <OctreeTestSystem>(); system.DebugLogging = false; var systemOriginal = base.m_World.GetOrCreateSystem <OctreeTestSystem2>(); systemOriginal.DebugLogging = false; var measurements = 15; var warmups = 2; float3 targetAreaPosition = targetPosition == RangeQueryTargetAreaPosition.Random ? new float3(Random.insideUnitSphere * extents) : 0; var bounds = new AABB { Center = 0, Extents = extents }; var queryAABB = new AABB { Center = targetAreaPosition, Extents = bounds.Extents * queryBounds }; var queryAabb = new Aabb { Min = queryAABB.Min, Max = queryAABB.Max }; var group = new SampleGroupDefinition { AggregationType = AggregationType.Average, Name = $"RangeQuery, Items:{items} Extents:{extents} QueryAABB:{queryAABB}", SampleUnit = SampleUnit.Millisecond }; var groupOriginal = new SampleGroupDefinition { AggregationType = AggregationType.Average, Name = $"RangeQuery.Original, Items:{items} Extents:{extents} QueryAABB:{queryAABB}", SampleUnit = SampleUnit.Millisecond }; var elements = new NativeArray <OctElement <int> >(items, Allocator.Temp); for (int j = 1; j < items; j++) // element 0 should always be a result. { elements[j] = new OctElement <int> { pos = new float3(Random.insideUnitSphere * extents), element = j }; } for (int i = 0; i < measurements; i++) { if (i < warmups) { var tree = new NativeOctree <int>(bounds, Allocator.Temp); var results = new NativeList <OctElement <int> >(resultResize ? 1 : items, Allocator.Temp); system.Build(tree, elements); system.RangeQuery(tree, queryAABB, results); var treeOriginal = new NativeOctree_Original <int>(bounds, Allocator.Temp); var resultsOriginal = new NativeList <OctElement <int> >(resultResize ? 1 : items * 25, Allocator.Temp); systemOriginal.Build(treeOriginal, elements); systemOriginal.RangeQuery(treeOriginal, queryAABB, resultsOriginal); } else { var tree = new NativeOctree <int>(bounds, Allocator.Temp); var results = new NativeList <OctElement <int> >(resultResize ? 1 : items, Allocator.Temp); system.Build(tree, elements); system.RangeQuery(tree, queryAABB, results); Measure.Custom(group, system.QueryStopWatch.Elapsed.TotalMilliseconds); var treeOriginal = new NativeOctree_Original <int>(bounds, Allocator.Temp); var resultsOriginal = new NativeList <OctElement <int> >(resultResize ? 1 : items * 25, Allocator.Temp); systemOriginal.Build(treeOriginal, elements); systemOriginal.RangeQuery(treeOriginal, queryAABB, resultsOriginal); Measure.Custom(groupOriginal, systemOriginal.QueryStopWatch.Elapsed.TotalMilliseconds); if (targetPosition == RangeQueryTargetAreaPosition.Centered) { Assert.IsTrue(resultsOriginal.Length > 0); } Assert.AreEqual(resultsOriginal.Length, results.Length); Debug.Log($"NativeOctree.RangeQuery Original={systemOriginal.QueryStopWatch.Elapsed.TotalMilliseconds:N4}ms Modified={system.QueryStopWatch.Elapsed.TotalMilliseconds:N4}ms for {results.Length} results"); Debug.Log($"TreeData Elements={*tree.Data}"); } } }
public ScopedFrameTimeMeasurement Scope(SampleGroupDefinition sampleGroupDefinition) { return(new ScopedFrameTimeMeasurement(sampleGroupDefinition)); }
public FramesMeasurement Definition(SampleGroupDefinition definition) { m_Definition = definition; return(this); }
public IEnumerator SampleTest() { // It goes to the group name "Time" // Measure the execution time of a method (measure 10 times, usage an average of 5 measurements) Measure.Method(() => { for (int i = 0; i < 1000000; i++) { } }) .MeasurementCount(10) .IterationsPerMeasurement(5) .Run(); // It goes to the group name "Time" // Measure the execution time of 10 frames, wait for 5 frames to warm up yield return(Measure.Frames() .WarmupCount(5) //.ProfilerMarkers(groupDefinitions) // if we just want to measure profiler without record frames //.DontRecordFrametime() .MeasurementCount(11) .Run()); // Measure the execution time of all frames using (Measure.Frames().Scope(new SampleGroupDefinition("Group 1"))) { // your code yield return(null); yield return(null); } // measure profiler data SampleGroupDefinition[] groupDefinitions = { new SampleGroupDefinition("PlayerLoop"), new SampleGroupDefinition("Camera.Render"), }; using (Measure.ProfilerMarkers(groupDefinitions)) { for (var i = 0; i < 60; i++) { yield return(null); } } // measure memory var allocated = new SampleGroupDefinition("TotalAllocatedMemory", SampleUnit.Megabyte); var reserved = new SampleGroupDefinition("TotalReservedMemory", SampleUnit.Megabyte); for (var i = 0; i < 60; i++) { Measure.Custom(allocated, Profiler.GetTotalAllocatedMemoryLong() / 1048576f); Measure.Custom(reserved, Profiler.GetTotalReservedMemoryLong() / 1048576f); yield return(null); } // load scene using (Measure.Scope(new SampleGroupDefinition("Group 3"))) { SceneManager.LoadScene("Assets/Scenes/WaitingRoom.unity"); } // measure instantiate of objects using (Measure.Scope(new SampleGroupDefinition("Group 4"))) { var cube = GameObject.CreatePrimitive(PrimitiveType.Cube); for (var i = 0; i < 5000; i++) { UnityEngine.Object.Instantiate(cube); } } yield return(null); }