使用基准测试对于我们应用的性能优化是比较好的方式,可以快速看出优化的结果同时可以给出报告结果
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

benchmarkdotnet dotnet 基准测试类库试用(一)的更多相关文章

  1. Asp.net Core dotnet 发布类库文件 带上注释,发布预发行版,带上所有引用

    带上注释 效果图 带上所有引用 效果图 预发行版 效果图 由于微软取消了  project.json  这个json 转而用了csproj 用于保存配置 所以懵逼很大一会 资料来源 project.j ...

  2. dotnet打包类库

    打包类库成Nuget包:dotnet pack --configuration Release --include-source --include-symbols --no-build,注意,需要在 ...

  3. Micro Benchmark Framework java 基准测试类库

    Micro Benchmark Framework 框架主要是method 层面上的 benchmark,精度可以精确到微秒级 比较典型的使用场景还有: 想定量地知道某个函数需要执行多长时间,以及执行 ...

  4. 【基准测试】BenchmarkDotNet介绍

    BenchmarkDotNet 概述 BenchmarkDotNet helps you to transform methods into benchmarks, track their perfo ...

  5. CI框架的引导流程以及基准测试类

    一[CI]框架的引导流程了解一下,并掌握如何新增自己的扩展类库   http://www.cnblogs.com/ohmygirl/p/CIRead-4.html // CI框架源码阅读笔记4 引导文 ...

  6. 程序开发常用第三方类库一览表(VendorLib)

    以下是自己开发过程中用到的第三方类库,记录下来方便查阅 ------------------------------------------------------------------------ ...

  7. 一起了解 .Net Foundation 项目 No.14

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. .NET Core .NE ...

  8. 一起了解 .Net Foundation 项目 No.19

    .Net 基金会中包含有很多优秀的项目,今天就和笔者一起了解一下其中的一些优秀作品吧. 中文介绍 中文介绍内容翻译自英文介绍,主要采用意译.如与原文存在出入,请以原文为准. Salesforce To ...

  9. 一系列令人敬畏的.NET核心库,工具,框架和软件

    内容 一般 框架,库和工具 API 应用框架 应用模板 身份验证和授权 Blockchain 博特 构建自动化 捆绑和缩小 高速缓存 CMS 代码分析和指标 压缩 编译器,管道工和语言 加密 数据库 ...

随机推荐

  1. 启动Sonar报错,ERROR: [1] bootstrap checks failed [1]: system call filters failed to install

    错误提示信息: ERROR: [1] bootstrap checks failed[1]: system call filters failed to install; check the logs ...

  2. Java学习:异常的概念

    异常 异常概念 异常:指的是程序在执行过程中,出现的非正常的情况,最终导致JVM的非正常停止. 在Java等面向对象的编程语言中,异常本身是一个类,产生异常就是创建异常对象并抛出一个异常对象.Java ...

  3. 客观->感官->意识->语言->思维->世界观、科学->思想

    客观->感官->意识->语言->思维->世界观.科学->思想

  4. 在window中安装Docker,并生成CentOS镜像

    下载并安装windows docker 修改镜像本地保存地址             

  5. css元素水平垂直居中

    温习一下元素水平垂直居中的几种方法 元素有具体宽度 1.absolute+负边距 .LV_center{ border: 1px solid red; position: absolute; widt ...

  6. C# 连接数据库的配置方法

    写在前面 在项目的开发过程中我门常常遇到会忘记数据库连接的配置的写法的尴尬处境.俗话说,好记性不如烂笔头.所以,mark一下. 1.Sqlserver数据库连接 <connectionStrin ...

  7. FullCalendar日历插件说明文档(看到这篇手册,解决了困扰我3天的js问题)

    FullCalendar提供了丰富的属性设置和方法调用,开发者可以根据FullCalendar提供的API快速完成一个日历日程的开发,本文将FullCalendar的常用属性和方法.回调函数等整理成中 ...

  8. Dijkstra算法求最短路径 Java实现

    基本原理: 迪杰斯特拉算法是一种贪心算法. 首先建立一个集合,初始化只有一个顶点.每次将当前集合的所有顶点(初始只有一个顶点)看成一个整体,找到集合外与集合距离最近的顶点,将其加入集合并检查是否修改路 ...

  9. MobX入门示例

    在相当长的一段时间内,Redux 都是前端开发人员作为状态管理的首先框架,如果不会 Redux,你都不好意思跟别人说自己是搞前端的. 没过多久,开发者们开始意识到,这东西虽说盛行,但它并没有传说中的那 ...

  10. python __getattr__ & __getattribute__ 学习

    实例属性的获取和拦截, 仅对实例属性(instance, variable)有效, 非类属性 getattr: 适用于未定义的属性, 即该属性在实例中以及对应的类的基类以及祖先类中都不存在 1. 动态 ...