zoukankan      html  css  js  c++  java
  • benchmarkdotnet dotnet 基准测试类库试用(一)

    使用基准测试对于我们应用的性能优化是比较好的方式,可以快速看出优化的结果同时可以给出报告结果
    benchmarkdotnet 是dotnet 版本的一个工具,以下是一个简单的试用

    环境准备

    我使用的是mac系统

    • 安装dotnetcoresdk
      这个很简单,选择操作系统安装就可以了
    • 创建简单console 项目
     
    mkdir benchmark
    cd benchmark
    dotnet new console
    • 添加benckmarldotnet 类库
    dotnet add package BenchmarkDotNet
    • 添加简单demo

      代码来自官方文档

    using System;
    using System.Security.Cryptography;
    using BenchmarkDotNet.Attributes;
    using BenchmarkDotNet.Running;
    namespace MyBenchmarks
    {
        public class Md5VsSha256
        {
            private const int N = 10000;
            private readonly byte[] data;
            private readonly SHA256 sha256 = SHA256.Create();
            private readonly MD5 md5 = MD5.Create();
            public Md5VsSha256()
            {
                data = new byte[N];
                new Random(42).NextBytes(data);
            }
            [Benchmark]
            public byte[] Sha256() => sha256.ComputeHash(data);
            [Benchmark]
            public byte[] Md5() => md5.ComputeHash(data);
        }
        public class Program
        {
            public static void Main(string[] args)
            {
                var summary = BenchmarkRunner.Run<Md5VsSha256>();
            }
        }
    }

    运行&&查看结果

    • 运行

      注意对于benchmark 需要的是release 版本的测试

    编译类库:
    dotnet build -c RELEASE
    dotnet bin/RELEASE/netcoreapp2.2/benchmark.dll
    或者直接:
    dotnet run -c release
    • 运行效果
    // Validating benchmarks:
    // ***** BenchmarkRunner: Start *****
    // ***** Found 2 benchmark(s) in total *****
    // ***** Building 1 exe(s) in Parallel: Start *****
    Unable to find .sln file. Will use current directory /Users/dalong/mylearning/aspnetcore-learning/benchmark to search for project file. If you don't use .sln file on purpose it should not be a problem.
    // start dotnet restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 in /Users/dalong/mylearning/aspnetcore-learning/benchmark/bin/RELEASE/netcoreapp2.2/4fdd42ee-69c6-492c-805f-2ee1777729fb
    // command took 1.73s and exited with 0
    // start dotnet build -c Release --no-restore /p:UseSharedCompilation=false /p:BuildInParallel=false /m:1 in /Users/dalong/mylearning/aspnetcore-learning/benchmark/bin/RELEASE/netcoreapp2.2/4fdd42ee-69c6-492c-805f-2ee1777729fb
    // command took 3.21s and exited with 0
    // ***** Done, took 00:00:05 (5.11 sec) *****
    // Found 2 benchmarks:
    // Md5VsSha256.Sha256: DefaultJob
    // Md5VsSha256.Md5: DefaultJob
    // **************************
    // Benchmark: Md5VsSha256.Sha256: DefaultJob
    // *** Execute ***
    // Launch: 1 / 1
    // Execute: dotnet "4fdd42ee-69c6-492c-805f-2ee1777729fb.dll" --benchmarkName "MyBenchmarks.Md5VsSha256.Sha256" --job "Default" --benchmarkId 0 in /Users/dalong/mylearning/aspnetcore-learning/benchmark/bin/RELEASE/netcoreapp2.2/4fdd42ee-69c6-492c-805f-2ee1777729fb/bin/Release/netcoreapp2.2
    Failed to set up high priority. Make sure you have the right permissions. Message: Permission denied
    // BeforeAnythingElse
    // Benchmark Process Environment Information:
    // Runtime=.NET Core 2.2.6 (CoreCLR 4.6.27817.03, CoreFX 4.6.27818.02), 64bit RyuJIT
    // GC=Concurrent Workstation
    // Job: DefaultJob
    OverheadJitting 1: 1 op, 598964.00 ns, 598.9640 us/op
    WorkloadJitting 1: 1 op, 1470156.00 ns, 1.4702 ms/op
    OverheadJitting 2: 16 op, 1153574.00 ns, 72.0984 us/op
    WorkloadJitting 2: 16 op, 1908217.00 ns, 119.2636 us/op
    WorkloadPilot 1: 16 op, 498621.00 ns, 31.1638 us/op
    WorkloadPilot 2: 32 op, 976046.00 ns, 30.5014 us/op
    WorkloadPilot 3: 64 op, 1959744.00 ns, 30.6210 us/op
    WorkloadPilot 4: 128 op, 4449342.00 ns, 34.7605 us/op
    WorkloadPilot 5: 256 op, 7827198.00 ns, 30.5750 us/op
    WorkloadPilot 6: 512 op, 15652304.00 ns, 30.5709 us/op
    WorkloadPilot 7: 1024 op, 31633970.00 ns, 30.8925 us/op
    WorkloadPilot 8: 2048 op, 60219960.00 ns, 29.4043 us/op
    WorkloadPilot 9: 4096 op, 122998260.00 ns, 30.0289 us/op
    WorkloadPilot 10: 8192 op, 243277420.00 ns, 29.6970 us/op
    WorkloadPilot 11: 16384 op, 490180822.00 ns, 29.9183 us/op
    WorkloadPilot 12: 32768 op, 1006114105.00 ns, 30.7042 us/op
    OverheadWarmup 1: 32768 op, 148275.00 ns, 4.5250 ns/op
     
    • 生成的报告目录

     


    html 报告结果

    • 其他运行方式
      实际上官方文档已经提供了比较全的运行方法
      通过全局工具方式
    dotnet tool install -g BenchmarkDotNet.Tool
    dotnet benchmark MyAssemblyWithBenchmarks.dll --filter *

    网络url

    string url = "<E.g. direct link to raw content of a gist>";
    var summary = BenchmarkRunner.RunUrl(url);

    源码

    string benchmarkSource = "public class MyBenchmarkClass { ...";
    var summary = BenchmarkRunner.RunSource(benchmarkSource);

    BenchmarkSwitcher

    static void Main(string[] args) => BenchmarkSwitcher.FromAssembly(typeof(Program).Assembly).Run(args);
    dotnet run -c Release -- --job short --runtimes clr core --filter *BenchmarkClass1*
     
     

    说明

    dotnet 的工具连是越来越丰富了,而且也越来人性化了,实际上基本上各种语言都是类似的实现类库。

    参考资料

    https://benchmarkdotnet.org/articles/guides/how-to-run.html
    https://github.com/dotnet/BenchmarkDotNet
    https://github.com/rongfengliang/aspnetcore-webapi-docker-compose-demo

  • 相关阅读:
    VM12+CentOS6.8安装VM tools
    PHP关联数组按某一value值排序
    命名规范
    JavaScript中的函数
    JavaScript中的for循环语句
    JavaScript中的判断和循环
    Javascript运算符的分类
    Html中的JavaScript
    【逆战】HTML5新语义化标签 (二)
    【逆战】HTML5新语义化标签 (一)
  • 原文地址:https://www.cnblogs.com/rongfengliang/p/11338122.html
Copyright © 2011-2022 走看看