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();
        }
Exemple #2
0
 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();
        }
Exemple #4
0
        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);
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        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);
        }
Exemple #7
0
    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);
    }
Exemple #8
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);
 }
Exemple #9
0
        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);
        }
Exemple #10
0
        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);
        }
Exemple #11
0
        private void UpdateSampleGroupDefinition()
        {
            if (m_Definition.Name == null)
            {
                m_Definition = new SampleGroupDefinition("Time");
            }

            if (m_ProfilerDefinitions == null)
            {
                m_ProfilerDefinitions = new SampleGroupDefinition[0];
            }
        }
Exemple #12
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);
        }
Exemple #13
0
        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);
        }
Exemple #14
0
    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");
            }
        }
    }
Exemple #15
0
    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}");
            }
        }
    }
Exemple #16
0
 public ScopedFrameTimeMeasurement Scope(SampleGroupDefinition sampleGroupDefinition)
 {
     return(new ScopedFrameTimeMeasurement(sampleGroupDefinition));
 }
Exemple #17
0
 public FramesMeasurement Definition(SampleGroupDefinition definition)
 {
     m_Definition = definition;
     return(this);
 }
Exemple #18
0
    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);
    }