benchmarkdotnet中文介绍:功能 · 入门 · 文档
作者:admin 时间:2023-5-13 8:27:35 浏览:BenchmarkDotNet可帮助你将方法转化为基准、跟踪其性能并共享可重现的测量实验。这并不比编写单元测试难!在引擎盖下,它执行了很多保证可靠和精确结果的技能。BenchmarkDotNet可以保护你免受常见的基准测试错误的影响,并在你的基准设计或获得的测量结果出现问题时向你发出警告。结果以用户友好的形式呈现,突出显示有关实验的所有重要事实。该库被包括 .NET Runtime 在内的14300 多个项目采用,并得到 .NET Foundation 的支持。
开始编写基准测试很容易,查看示例:
[SimpleJob(RuntimeMoniker.Net472, baseline: true)]
[SimpleJob(RuntimeMoniker.NetCoreApp30)]
[SimpleJob(RuntimeMoniker.NativeAot70)]
[SimpleJob(RuntimeMoniker.Mono)]
[RPlotExporter]
public class Md5VsSha256
{
private SHA256 sha256 = SHA256.Create();
private MD5 md5 = MD5.Create();
private byte[] data;
[Params(1000, 10000)]
public int N;
[GlobalSetup]
public void Setup()
{
data = new byte[N];
new Random(42).NextBytes(data);
}
[Benchmark]
public byte[] Sha256() => sha256.ComputeHash(data);
[Benchmark]
public byte[] Md5() => md5.ComputeHash(data);
}
BenchmarkDotNet 自动在所有运行时运行基准测试,汇总测量结果,并打印包含最重要信息的汇总表:
BenchmarkDotNet=v0.12.0, OS=Windows 10.0.17763.805 (1809/October2018Update/Redstone5)
Intel Core i7-7700K CPU 4.20GHz (Kaby Lake), 1 CPU, 8 logical and 4 physical cores
[Host] : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
Net472 : .NET Framework 4.7.2 (4.7.3468.0), X64 RyuJIT
NetCoreApp30 : .NET Core 3.0.0 (CoreCLR 4.700.19.46205, CoreFX 4.700.19.46214), X64 RyuJIT
NativeAot70 : .NET 7.0.0-preview.4.22172.7, X64 NativeAOT
Mono : Mono 6.4.0 (Visual Studio), X64
| Method | Runtime | N | Mean | Error | StdDev | Ratio |
|------- |-------------- |------ |-----------:|----------:|----------:|------:|
| Sha256 | .NET 4.7.2 | 1000 | 7.735 us | 0.1913 us | 0.4034 us | 1.00 |
| Sha256 | .NET Core 3.0 | 1000 | 3.989 us | 0.0796 us | 0.0745 us | 0.50 |
| Sha256 | NativeAOT 7.0 | 1000 | 4.091 us | 0.0811 us | 0.1562 us | 0.53 |
| Sha256 | Mono | 1000 | 13.117 us | 0.2485 us | 0.5019 us | 1.70 |
| | | | | | | |
| Md5 | .NET 4.7.2 | 1000 | 2.872 us | 0.0552 us | 0.0737 us | 1.00 |
| Md5 | .NET Core 3.0 | 1000 | 1.848 us | 0.0348 us | 0.0326 us | 0.64 |
| Md5 | NativeAOT 7.0 | 1000 | 1.817 us | 0.0359 us | 0.0427 us | 0.63 |
| Md5 | Mono | 1000 | 3.574 us | 0.0678 us | 0.0753 us | 1.24 |
| | | | | | | |
| Sha256 | .NET 4.7.2 | 10000 | 74.509 us | 1.5787 us | 4.6052 us | 1.00 |
| Sha256 | .NET Core 3.0 | 10000 | 36.049 us | 0.7151 us | 1.0025 us | 0.49 |
| Sha256 | NativeAOT 7.0 | 10000 | 36.253 us | 0.7076 us | 0.7571 us | 0.49 |
| Sha256 | Mono | 10000 | 116.350 us | 2.2555 us | 3.0110 us | 1.58 |
| | | | | | | |
| Md5 | .NET 4.7.2 | 10000 | 17.308 us | 0.3361 us | 0.4250 us | 1.00 |
| Md5 | .NET Core 3.0 | 10000 | 15.726 us | 0.2064 us | 0.1930 us | 0.90 |
| Md5 | NativeAOT 7.0 | 10000 | 15.627 us | 0.2631 us | 0.2461 us | 0.89 |
| Md5 | Mono | 10000 | 30.205 us | 0.5868 us | 0.6522 us | 1.74 |
测量数据可以导出为不同格式(md、html、csv、xml、json 等),包括绘图:
支持的运行时: .NET 5+、.NET Framework 4.6.1+、.NET Core 2.0+、Mono、NativeAOT
支持的语言: C#、F#、Visual Basic
支持的操作系统: Windows、Linux、macOS
支持的架构: x86、x64、ARM , ARM64, Wasm 和 LoongArch64
特征
BenchmarkDotNet 具有大量在综合性能调查中必不可少的功能。四个方面定义了这些功能的设计: 简单性、自动化、可靠性和友好性。
简单
如果你想编写基准测试,而你不是一位经验丰富的性能工程师,你可以使用简单的 API 以声明式的方式设计非常复杂的性能实验。
例如,如果你想参数化你的基准,标记一个字段或一个属性[Params(1, 2, 3)]
:BenchmarkDotNet 将枚举所有指定的值并为每个案例运行基准。如果你想相互比较基准,请通过[Benchmark(Baseline = true)]
将其中一个基准标记为基准:BenchmarkDotNet
会将其与所有其他基准进行比较。如果要比较不同环境中的性能,请使用jobs。例如,你可以通过 [SimpleJob(RuntimeMoniker.NetCoreApp30)]
和[SimpleJob(RuntimeMoniker.Mono)]
在 .NET Core 3.0 和 Mono 上运行所有基准测试。
如果你不喜欢属性,你可以通过 fluent 风格调用大部分 API,并编写如下代码:
ManualConfig.CreateEmpty() // A configuration for our benchmarks
.AddJob(Job.Default // Adding first job
.WithRuntime(ClrRuntime.Net472) // .NET Framework 4.7.2
.WithPlatform(Platform.X64) // Run as x64 application
.WithJit(Jit.LegacyJit) // Use LegacyJIT instead of the default RyuJIT
.WithGcServer(true) // Use Server GC
).AddJob(Job.Default // Adding second job
.AsBaseline() // It will be marked as baseline
.WithEnvironmentVariable("Key", "Value") // Setting an environment variable
.WithWarmupCount(0) // Disable warm-up stage
);
如果你更喜欢命令行体验,则可以通过任何控制台应用程序中的控制台参数配置基准测试 (不支持其他类型的应用程序)。
自动化
可靠的基准测试总是包含大量样板代码。
让我们考虑一下在典型情况下你应该做什么。首先,你应该执行试点实验并确定最佳的方法调用次数。接下来,你应该执行几次预热迭代并确保你的基准测试达到稳定状态。之后,你应该执行主要迭代并计算一些基本统计数据。如果你在基准测试中计算了一些值,你应该以某种方式使用它来防止死代码消除。如果你使用循环,你应该关心循环展开对结果的影响(这可能取决于处理器架构)。获得结果后,你应该检查所获得的性能分布的一些特殊属性,例如多模态或极高的离群值。你还应该评估基础设施的开销,并从结果中扣除。
如果你从头开始编写此代码,很容易出错并破坏你的测量结果。请注意,这是你在基准测试期间应遵循的完整清单的简化版本:还有许多其他隐藏的陷阱需要妥善处理。幸运的是,你不必担心,因为 BenchmarkDotNet会为你完成这些无聊且耗时的工作。
此外,库可以帮助你完成一些你可能希望在调查期间执行的高级任务。例如,BenchmarkDotNet 可以测量托管和本机内存流量并为你的基准打印反汇编列表。
可靠性
许多手写的基准测试会产生错误的数字,从而导致错误的业务决策。BenchmarkDotNet 保护你免受大多数基准测试陷阱的影响,并允许实现高测量精度。
你不应该担心方法调用的完美次数、预热次数和实际迭代次数:BenchmarkDotNet 尝试选择最佳基准测试参数,并在测量预测和所有基准测试运行的总持续时间之间取得良好的权衡. 所以,你不应该使用任何幻数(比如“我们应该在这里执行 100 次迭代”),库会根据统计指标的值为你做这件事。
BenchmarkDotNet 还阻止对使用 DEBUG 模式构建的未优化程序集进行基准测试,因为相应的结果将不可靠。如果你有一个附加的调试器,如果你使用管理程序(HyperV,VMware,VirtualBox),或者如果你对当前环境有任何其他问题,它会打印一条警告。
在 6 年多的开发过程中,我们遇到了许多可能会破坏你的测量结果的不同问题。在 BenchmarkDotNet 内部,有很多启发式、检查、技巧和技巧可以帮助你提高结果的可靠性。
友好
性能数据分析是一项耗时的活动,需要注意力、知识和经验。BenchmarkDotNet 为你执行此分析的主要部分,并以用户友好的形式呈现结果。
实验结束后,你会得到一个汇总表,其中包含有关已执行基准测试的大量有用数据。默认情况下,它只包含最重要的列,但可以轻松自定义。列集是自适应的,取决于基准定义和测量值。例如,如果你将其中一个基准标记为基线,你将获得额外的列,这些列将帮助你将所有基准与基线进行比较。默认情况下,它始终显示均值列,但如果我们检测到均值和中值之间存在巨大差异,则会显示两列。
BenchmarkDotNet 试图找到性能分布的一些不寻常属性并打印有关它的好消息。例如,它会在多峰分布或高异常值的情况下向你发出警告。在这种情况下,你可以向上滚动结果并查看每个分布的 ASCII 样式直方图,或使用生成漂亮的 png 图。
BenchmarkDotNet 不会让你超载数据;它仅根据你的结果显示基本信息:它允许你为原始案例保留小的摘要,并仅为复杂案例扩展它。当然,你可以手动请求任何其他统计数据和可视化。如果你不自定义摘要视图,则默认演示文稿将尽可能方便用户使用。:)
谁使用 BenchmarkDotNet?
每个人!BenchmarkDotNet 已被超过14300 个项目采用,包括 dotnet/performance(所有 .NET 运行时的参考基准)、 dotnet/runtime(.NET 运行时和库)、 Roslyn(C# 和 Visual Basic 编译器)、 Mono、 ASP.NET Core , ML.NET , Entity Framework Core, PowerShell SignalR , F# , Orleans , Newtonsoft.Json , Elasticsearch.Net , Dapper , Expecto , ImageSharp , RavenDB , NodaTime、 Jint、 NServiceBus、 Serilog 、Autofac、 Npgsql、 Avalonia、 ReactiveUI、 SharpZipLib、 LiteDB 、 GraphQL for .NET、 .NET Docs、 RestSharp、 MediatR、 TensorFlow.NET、 Apache Thrift。 在 GitHub 上,你可以找到 12600 多个问题、5200 多个提交和 1,600,000 多个 涉及 BenchmarkDotNet 的文件。
了解有关基准测试的更多信息
BenchmarkDotNet 并不是神奇地使你的所有基准测试正确并为你分析测量结果的灵丹妙药。即使你使用这个库,你仍然应该知道如何设计基准实验以及如何根据原始数据做出正确的结论。如果你想了解更多关于基准测试方法和良好实践的信息,建议阅读 Andrey Akinshin(BenchmarkDotNet 项目负责人)所著的一本书:“Pro .NET Benchmarking”。使用这个深入的指南来正确设计基准、测量 .NET 应用程序的关键性能指标并分析结果。本书介绍了数十个案例研究,可帮助你理解复杂的基准测试主题。你将避免常见的陷阱,控制测量的准确性。
构建状态
搭建服务器 | 平台 | 构建状态 |
---|---|---|
Azure Pipelines | 视窗 | |
Azure Pipelines | Ubuntu | |
Azure Pipelines | 苹果系统 | |
AppVeyor | 视窗 | |
GitHub 操作 | * |
欢迎投稿!
BenchmarkDotNet 已经是一个稳定的全功能库,可以在专业水平上进行性能调查。而且还在不断进化!我们一直在添加新功能,但我们有太多新奇的想法。任何帮助将不胜感激。你可以开发新功能、修复错误、改进文档或做一些其他很酷的事情。
如果你想做出贡献,请查看贡献指南和待售问题。如果你有新想法或想抱怨错误,请随时创建一个新问题。让我们一起构建最好的基准测试工具!
行为守则
该项目采用了贡献者公约定义的行为准则 ,以阐明我们社区的预期行为。有关详细信息,请参阅 .NET Foundation 行为准则。
- 站长推荐