Ejemplo n.º 1
0
            public JustDisassembly()
            {
                Add(Job.Dry.With(Jit.RyuJit).With(Platform.X64).With(Runtime.Core).With(CsProjCoreToolchain.NetCoreApp20));
                Add(Job.Dry.With(Jit.RyuJit).With(Platform.X64).With(Runtime.Core).With(CsProjCoreToolchain.NetCoreApp21));

                Add(DisassemblyDiagnoser.Create(new DisassemblyDiagnoserConfig(printAsm: true, printPrologAndEpilog: true, recursiveDepth: 3)));
            }
Ejemplo n.º 2
0
            public JustDisassembly()
            {
                AddJob(Job.Dry.WithJit(Jit.RyuJit).WithPlatform(Platform.X64).WithRuntime(CoreRuntime.Core20));
                AddJob(Job.Dry.WithJit(Jit.RyuJit).WithPlatform(Platform.X64).WithRuntime(CoreRuntime.Core21));

                AddDiagnoser(DisassemblyDiagnoser.Create(new DisassemblyDiagnoserConfig(printAsm: true, printPrologAndEpilog: true, recursiveDepth: 3)));
            }
        public FullProfileConfig()
        {
            var summaryStyle = new SummaryStyle(false, SizeUnit.KB, TimeUnit.Millisecond, true);

            this.SummaryStyle = summaryStyle;

            Add(
                DisassemblyDiagnoser.Create(
                    new DisassemblyDiagnoserConfig(printAsm: true, printPrologAndEpilog: true, recursiveDepth: 3, printDiff: true)
                    )
                );
            Add(MemoryDiagnoser.Default);
            Add(
                HardwareCounter.BranchInstructions,
                //HardwareCounter.CacheMisses,
                HardwareCounter.BranchMispredictions
                );
            Add(
                Job
                .Core
                .With(Runtime.Core)
                .WithWarmupCount(2)
                .WithIterationCount(10)
                .WithIterationTime(TimeInterval.FromMilliseconds(200))
                .WithLaunchCount(1)
                .With(new GcMode()
            {
                Force = false
            })
                );
        }
Ejemplo n.º 4
0
        public BenchmarkConfig()
        {
            Add(MemoryDiagnoser.Default);
            Add(DisassemblyDiagnoser.Create(
                    new DisassemblyDiagnoserConfig(
                        printAsm: true,
                        printIL: true,
                        printSource: true)));
            Add(AsciiDocExporter.Default);

            Add(Job.Core
                .With(CsProjCoreToolchain.NetCoreApp22)
                .With(new[] { new EnvironmentVariable(JitTieredCompilation, "1") })
                .WithGcServer(true)
                .WithId("CsProjCoreToolchain.NetCoreApp22"));

            Add(Job.Core
                .With(CsProjCoreToolchain.NetCoreApp30)
                .With(new[] { new EnvironmentVariable(JitTieredCompilation, "1") })
                .WithGcServer(true)
                .WithId("CsProjCoreToolchain.NetCoreApp30"));

            Add(Job.Core
                .With(CsProjClassicNetToolchain.Net472)
                .WithGcServer(true)
                .WithId("CsProjClassicNetToolchain.Net472"));
        }
Ejemplo n.º 5
0
        public CoreClrConfig()
        {
            var job = Job.MediumRun.With(
                CustomCoreClrToolchain.CreateBuilder()
                .UseCoreClrNuGet("3.0.0-preview1-26814-05", "https://dotnet.myget.org/F/dotnet-core/api/v3/index.json")
                .UseCoreFxNuGet("4.6.0-preview1-26814-05", "https://dotnet.myget.org/F/dotnet-core/api/v3/index.json")
                .TargetFrameworkMoniker("netcoreapp3.0")
                .DisplayName("Net Core 3.0")
                .RuntimeIdentifier("win-x64")
                .ToToolchain())
                      .WithGcServer(true)
                      .WithIterationCount(23)
                      .WithLaunchCount(1)
                      .WithWarmupCount(5);

            Add(job.With(
                    new List <EnvironmentVariable>()
            {
                new EnvironmentVariable("COMPlus_EnableAVX", "0"),
                new EnvironmentVariable("COMPlus_TieredCompilation", "0")
            }));

            //DefaultConfig.Instance.With()
            Add(DefaultConfig.Instance.GetExporters().ToArray());
            Add(DefaultConfig.Instance.GetLoggers().ToArray());
            Add(DefaultConfig.Instance.GetColumnProviders().ToArray());

            var diagnoser = new DisassemblyDiagnoserConfig(
                printAsm: true, printSource: true, printPrologAndEpilog: true, recursiveDepth: 2);

            Add(DisassemblyDiagnoser.Create(diagnoser));
        }
Ejemplo n.º 6
0
        public DiagnoserConfig()
        {
            var run = Job.Dry.With(new[] { new EnvironmentVariable("COMPlus_TieredCompilation", "0") });

            Add(run);
            Add(DisassemblyDiagnoser.Create(new DisassemblyDiagnoserConfig(true, false, true, true, 5)));
            Add(new InliningDiagnoser());
        }
Ejemplo n.º 7
0
        static void Main(string[] args)
        {
            var config = DefaultConfig.Instance
                         .With(MemoryDiagnoser.Default)
                         .With(DisassemblyDiagnoser.Create(new DisassemblyDiagnoserConfig(printAsm: true, printIL: true, recursiveDepth: 3, printDiff: true)));
            var summary = BenchmarkRunner.Run <Point2DManagerStructUseCustomEqualsWithoutBoxing>(config);

            Console.ReadKey();
        }
Ejemplo n.º 8
0
        public DiagnoserConfig()
        {
            var run = Job.Dry.With(new[] { new EnvironmentVariable("COMPlus_TieredCompilation", "0") });

            Add(run);
            Add(DisassemblyDiagnoser.Create(new DisassemblyDiagnoserConfig(true, true, true, true, 4)));
            Add(ReturnValueValidator.FailOnError);
            Add(new InliningDiagnoser());
        }
Ejemplo n.º 9
0
        public Config()
        {
            Add(Job.ShortRun.With(Jit.RyuJit).With(Platform.X64).With(Runtime.Clr));
            Add(Job.ShortRun.With(Jit.RyuJit).With(Platform.X64).With(Runtime.Core).With(CsProjCoreToolchain.NetCoreApp20));


            Add(StatisticColumn.Min);
            Add(StatisticColumn.Max);
            Add(DisassemblyDiagnoser.Create(new DisassemblyDiagnoserConfig(printAsm: true, printPrologAndEpilog: true, recursiveDepth: 3)));
        }
        public void CanDisassembleGenericTypes(Jit jit, Platform platform, Runtime runtime)
        {
            var disassemblyDiagnoser = (IDisassemblyDiagnoser)DisassemblyDiagnoser.Create(
                new DisassemblyDiagnoserConfig(printAsm: true, printIL: true, printSource: true, recursiveDepth: 3));

            CanExecute <Generic <int> >(CreateConfig(jit, platform, runtime, disassemblyDiagnoser, RunStrategy.Monitoring));

            var result = disassemblyDiagnoser.Results.Values.Single();

            Assert.Contains(result.Methods, method => method.Maps.Any(map => map.Instructions.OfType <Asm>().Any()));
        }
        public void DuplicateDiagnosersAreExcludedBasedOnType()
        {
            var mutable = ManualConfig.CreateEmpty();

            mutable.Add(DisassemblyDiagnoser.Create(DisassemblyDiagnoserConfig.All));
            mutable.Add(DisassemblyDiagnoser.Create(DisassemblyDiagnoserConfig.Asm));

            var final = ImmutableConfigBuilder.Create(mutable);

            Assert.Single(final.GetDiagnosers());
        }
Ejemplo n.º 12
0
        public void CanDisassembleInlinableBenchmarks(Jit jit, Platform platform, Runtime runtime)
        {
            var disassemblyDiagnoser = new DisassemblyDiagnoser(
                new DisassemblyDiagnoserConfig(printSource: true, maxDepth: 3));

            CanExecute <WithInlineable>(CreateConfig(jit, platform, runtime, disassemblyDiagnoser, RunStrategy.Monitoring));

            var disassemblyResult = disassemblyDiagnoser.Results.Values.Single(result => result.Methods.Count(method => method.Name.Contains(nameof(WithInlineable.JustReturn))) == 1);

            Assert.Contains(disassemblyResult.Methods, method => method.Maps.Any(map => map.SourceCodes.OfType <Asm>().All(asm => asm.Instruction.ToString().Contains("ret"))));
        }
        public void WhenUserDefinesHardwareCountersAndUsesDisassemblyDiagnoserWeAddInstructionPointerExporter()
        {
            var mutable = ManualConfig.CreateEmpty();

            mutable.Add(HardwareCounter.CacheMisses);
            mutable.Add(DisassemblyDiagnoser.Create(DisassemblyDiagnoserConfig.All));

            var final = ImmutableConfigBuilder.Create(mutable);

            Assert.Single(final.GetDiagnosers().OfType <IHardwareCountersDiagnoser>());
            Assert.Single(final.GetDiagnosers().OfType <IDisassemblyDiagnoser>());
            Assert.Single(final.GetExporters().OfType <InstructionPointerExporter>());
        }
Ejemplo n.º 14
0
        public void CanDisassembleAllMethodCalls(Jit jit, Platform platform, Runtime runtime)
        {
            var disassemblyDiagnoser = new DisassemblyDiagnoser(
                new DisassemblyDiagnoserConfig(printSource: true, maxDepth: 3));

            CanExecute <WithCalls>(CreateConfig(jit, platform, runtime, disassemblyDiagnoser, RunStrategy.ColdStart));

            AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Benchmark)}(Int32)");
            AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Benchmark)}(Boolean)");
            AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Static)}()");
            AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Instance)}()");
            AssertDisassembled(disassemblyDiagnoser, $"{nameof(WithCalls.Recursive)}()");
        }
Ejemplo n.º 15
0
        public MultipleJits()
        {
            Add(Job.ShortRun.With(Runtime.Mono).With(Platform.X86));
            Add(Job.ShortRun.With(Runtime.Mono).With(Platform.X64));

            Add(Job.ShortRun.With(Jit.LegacyJit).With(Platform.X86).With(Runtime.Clr));
            Add(Job.ShortRun.With(Jit.LegacyJit).With(Platform.X64).With(Runtime.Clr));
            Add(Job.ShortRun.With(Jit.RyuJit).With(Platform.X64).With(Runtime.Clr));

            Add(Job.ShortRun.With(Jit.RyuJit).With(Platform.X64).With(Runtime.Core).With(CsProjCoreToolchain.NetCoreApp20));
            Add(Job.ShortRun.With(Jit.RyuJit).With(Platform.X86).With(Runtime.Core).With(CsProjCoreToolchain.NetCoreApp20));

            Add(DisassemblyDiagnoser.Create(new DisassemblyDiagnoserConfig(printAsm: true, printPrologAndEpilog: true, recursiveDepth: 3)));
        }
        public void VeryShortJobsAreNotSupported()
        {
            var disassemblyDiagnoser = (IDisassemblyDiagnoser)DisassemblyDiagnoser.Create(
                new DisassemblyDiagnoserConfig(printAsm: true, printIL: true, printSource: true, recursiveDepth: 3));

            var config = ManualConfig.CreateEmpty()
                         .With(Job.Dry)
                         .With(DefaultConfig.Instance.GetLoggers().ToArray())
                         .With(DefaultColumnProviders.Instance)
                         .With(disassemblyDiagnoser)
                         .With(new OutputLogger(Output));

            var validationErrors = disassemblyDiagnoser.Validate(BenchmarkConverter.TypeToBenchmarks(typeof(WithCalls), config)).ToArray();

            Assert.Contains(validationErrors, error => error.IsCritical && error.Message == "No Job.Dry support for disassembler. Please use Job.Short");
        }
Ejemplo n.º 17
0
            public MultipleJits()
            {
                AddJob(Job.ShortRun.WithPlatform(Platform.X86).WithRuntime(new MonoRuntime(name: "Mono x86", customPath: @"C:\Program Files (x86)\Mono\bin\mono.exe")));
                AddJob(Job.ShortRun.WithPlatform(Platform.X64).WithRuntime(new MonoRuntime(name: "Mono x64", customPath: @"C:\Program Files\Mono\bin\mono.exe")));

                AddJob(Job.ShortRun.WithJit(Jit.LegacyJit).WithPlatform(Platform.X86).WithRuntime(ClrRuntime.Net461));
                AddJob(Job.ShortRun.WithJit(Jit.LegacyJit).WithPlatform(Platform.X64).WithRuntime(ClrRuntime.Net461));

                AddJob(Job.ShortRun.WithJit(Jit.RyuJit).WithPlatform(Platform.X64).WithRuntime(ClrRuntime.Net461));

                // RyuJit for .NET Core 2.0
                AddJob(Job.ShortRun.WithJit(Jit.RyuJit).WithPlatform(Platform.X64).WithRuntime(CoreRuntime.Core20));

                // RyuJit for .NET Core 2.1
                AddJob(Job.ShortRun.WithJit(Jit.RyuJit).WithPlatform(Platform.X64).WithRuntime(CoreRuntime.Core21));

                AddDiagnoser(DisassemblyDiagnoser.Create(new DisassemblyDiagnoserConfig(printAsm: true, printPrologAndEpilog: true, recursiveDepth: 3, printDiff: true)));
            }
Ejemplo n.º 18
0
        public MultipleRuntimesConfig()
        {
            Add(Job.Default
                .With(CsProjClassicNetToolchain.Net471) // Span NOT supported by Runtime
                .WithId(".NET 4.7.1"));

            //Add(Job.Default
            //    .With(CsProjCoreToolchain.NetCoreApp11) // Span NOT supported by Runtime
            //    .WithId(".NET Core 1.1"));

            /// !!! warning !!! NetCoreApp20 toolchain simply sets TargetFramework = netcoreapp2.0 in generated .csproj
            /// // so you need Visual Studio 2017 Preview 15.3 to be able to run it!
            //Add(Job.Default
            //    .With(CsProjCoreToolchain.NetCoreApp20) // Span SUPPORTED by Runtime
            //    .WithId(".NET Core 2.0"));

            Add(Job.Default
                .With(CsProjCoreToolchain.NetCoreApp21) // Span SUPPORTED by Runtime
                .WithId(".NET Core 2.1"));
            Add(DisassemblyDiagnoser.Create(new DisassemblyDiagnoserConfig(printAsm: true, printIL: true,
                                                                           printSource: true)));
            Add(MemoryDiagnoser.Default);
        }
Ejemplo n.º 19
0
        public override void ExportToLog(Summary summary, ILogger logger)
        {
            var reporter = Reporter.CreateReporter();

            if (!reporter.InLab) // not running in the perf lab
            {
                return;
            }

            DisassemblyDiagnoser disassemblyDiagnoser = summary.Reports
                                                        .FirstOrDefault()? // dissasembler was either enabled for all or none of them (so we use the first one)
                                                        .BenchmarkCase.Config.GetDiagnosers().OfType <DisassemblyDiagnoser>().FirstOrDefault();

            foreach (var report in summary.Reports)
            {
                var test = new Test();
                test.Name       = FullNameProvider.GetBenchmarkName(report.BenchmarkCase);
                test.Categories = report.BenchmarkCase.Descriptor.Categories;

                var results = from result in report.AllMeasurements
                              where result.IterationMode == Engines.IterationMode.Workload && result.IterationStage == Engines.IterationStage.Result
                              orderby result.LaunchIndex, result.IterationIndex
                    select new { result.Nanoseconds, result.Operations };

                var overheadResults = from result in report.AllMeasurements
                                      where result.IsOverhead() && result.IterationStage != Engines.IterationStage.Jitting
                                      orderby result.LaunchIndex, result.IterationIndex
                    select new { result.Nanoseconds, result.Operations };

                test.Counters.Add(new Counter
                {
                    Name           = "Duration of single invocation",
                    TopCounter     = true,
                    DefaultCounter = true,
                    HigherIsBetter = false,
                    MetricName     = "ns",
                    Results        = (from result in results
                                      select result.Nanoseconds / result.Operations).ToList()
                });
                test.Counters.Add(new Counter
                {
                    Name           = "Overhead invocation",
                    TopCounter     = false,
                    DefaultCounter = false,
                    HigherIsBetter = false,
                    MetricName     = "ns",
                    Results        = (from result in overheadResults
                                      select result.Nanoseconds / result.Operations).ToList()
                });
                test.Counters.Add(new Counter
                {
                    Name           = "Duration",
                    TopCounter     = false,
                    DefaultCounter = false,
                    HigherIsBetter = false,
                    MetricName     = "ms",
                    Results        = (from result in results
                                      select result.Nanoseconds).ToList()
                });

                test.Counters.Add(new Counter
                {
                    Name           = "Operations",
                    TopCounter     = false,
                    DefaultCounter = false,
                    HigherIsBetter = true,
                    MetricName     = "Count",
                    Results        = (from result in results
                                      select(double) result.Operations).ToList()
                });

                foreach (var metric in report.Metrics.Keys)
                {
                    var m = report.Metrics[metric];
                    test.Counters.Add(new Counter
                    {
                        Name           = m.Descriptor.DisplayName,
                        TopCounter     = false,
                        DefaultCounter = false,
                        HigherIsBetter = m.Descriptor.TheGreaterTheBetter,
                        MetricName     = m.Descriptor.Unit,
                        Results        = new[] { m.Value }
                    });
                }

                if (disassemblyDiagnoser != null && disassemblyDiagnoser.Results.TryGetValue(report.BenchmarkCase, out var disassemblyResult))
                {
                    string disassembly = DiffableDisassemblyExporter.BuildDisassemblyString(disassemblyResult, disassemblyDiagnoser.Config);
                    test.AdditionalData["disasm"] = disassembly;
                }

                reporter.AddTest(test);
            }

            logger.WriteLine(reporter.GetJson());
        }
Ejemplo n.º 20
0
 private static IConfig CreateDefaultConfig() =>
 DefaultConfig
 .Instance
 .With(Job.Default.With(CoreRuntime.Core31), Job.Default.With(ClrRuntime.Net48))
 .With(MemoryDiagnoser.Default)
 .With(DisassemblyDiagnoser.Create(DisassemblyDiagnoserConfig.Asm));
Ejemplo n.º 21
0
 private void AssertDisassembled(DisassemblyDiagnoser diagnoser, string methodSignature)
 {
     Assert.True(diagnoser.Results.Single().Value
                 .Methods.Any(method => method.Name.EndsWith(methodSignature) && method.Maps.Any(map => map.SourceCodes.Any())),
                 $"{methodSignature} is missing");
 }
 internal InstructionPointerExporter(IHardwareCountersDiagnoser hardwareCountersDiagnoser, DisassemblyDiagnoser disassemblyDiagnoser)
 {
     this.hardwareCountersDiagnoser = hardwareCountersDiagnoser;
     this.disassemblyDiagnoser      = disassemblyDiagnoser;
 }
Ejemplo n.º 23
0
 private static IConfig CreateDefaultConfig() =>
 DefaultConfig
 .Instance
 .With(Job.Core, Job.Clr)
 .With(MemoryDiagnoser.Default)
 .With(DisassemblyDiagnoser.Create(DisassemblyDiagnoserConfig.Asm));