コード例 #1
0
        public void TestInstructionCounting()
        {
            int externalValue = 0;

            PerformanceMetrics Benchmark(int iterations)
            {
                using var counter = new PerfCounter();
                counter.Start();
                for (int i = 0; i < iterations; i++)
                {
                    externalValue += (int)Math.Sqrt(2);
                }
                counter.Stop();
                return(counter.GetResults());
            }

            for (int i = 0; i < 3; i++)
            {
                var measurement = Benchmark(1000);
            }
            int baseIterations = 1;
            var overhead       = Benchmark(baseIterations);

            Console.WriteLine($"Overhead:   {overhead.Instructions}");
            int iterations       = 1024;
            var finalMeasurement = Benchmark(iterations + baseIterations);

            Console.WriteLine($"Final:      {finalMeasurement.Instructions}");
            var cleaned = finalMeasurement - overhead;

            Console.WriteLine("Per iteration:");
            Console.WriteLine($"Instructions: {cleaned.Instructions / (double)iterations:0.00}");
            Console.WriteLine($"Cycles:       {cleaned.Cycles / (double)iterations:0.00}");
            Console.WriteLine($"Task clock:   {cleaned.TaskClock / (double)iterations:0.00}");

            Assert.That(overhead.Instructions, Is.GreaterThan(0));
            Assert.That(finalMeasurement.Instructions, Is.GreaterThan(overhead.Instructions));
            Assert.That(cleaned.Instructions, Is.GreaterThan(iterations / 32));

            // uncomment the following line to see the results
            Assert.Fail();
        }