BenchmarkDotNet的使用

8 篇文章 1 订阅

我的高级架构师告诉我,检验程序性能时不要用DateTime.Now相减或者StopWatch,最好用BenchmarkDotNet,于是我就试了一下。
上手体验后感觉BenchmarkDotNet大致的特点如下:

  1. 用起来还比较简单,在对应的method上面打上[Benchmark]标记即可;
  2. 通过var summary = BenchmarkRunner.Run();来启动;
  3. 要求class和method必须是public;
  4. 要求程序必须是Release;
  5. 会自动将程序中打标记的对应模块跑很多遍,最后给出均值和偏差;

使用前要在NuGet管理器中,或者在包管理器的PM终端中安装BenchmarkDotNet。
在这里插入图片描述

最后上代码(以测试SeriLog和原生StreamWriter的效率对比为例):

// See https://aka.ms/new-console-template for more information
using BenchmarkDotNet.Attributes;
using BenchmarkDotNet.Running;
using Serilog;
using Serilog.Core;

SerilogTest.Program.main();

namespace SerilogTest
{
    public class Program
    {
        Logger _log2Console = new LoggerConfiguration().WriteTo.Console().CreateLogger();
        Logger _log2File = new LoggerConfiguration().WriteTo.File("seri.log").CreateLogger();
        private StreamWriter _sw2File = new StreamWriter("sq.log");
        private int _loopMaxTime = 100;

        [Benchmark]
        public double Seri2ConsoleI()
        {
            DateTime tmpStartTime = System.DateTime.Now;
            for (int i = 1; i < _loopMaxTime; i++)
            {
                _log2Console.Information($"Serilog info {i}");
            }
            Log.CloseAndFlush();
            DateTime tmpEndTime = System.DateTime.Now;
            TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);
            return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);
        }

        [Benchmark]
        public double Seri2ConsoleE()
        {
            DateTime tmpStartTime = System.DateTime.Now;
            for (int i = 1; i < _loopMaxTime; i++)
            {
                _log2Console.Error($"Serilog error {i}");
            }
            Log.CloseAndFlush();
            DateTime tmpEndTime = System.DateTime.Now;
            TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);
            return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);
        }

        [Benchmark]
        public double Seri2FileI()
        {
            DateTime tmpStartTime = System.DateTime.Now;
            for (int i = 1; i < _loopMaxTime; i++)
            {
                _log2File.Information($"Serilog info {i}");
            }
            Log.CloseAndFlush();
            DateTime tmpEndTime = System.DateTime.Now;
            TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);
            return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);
        }

        [Benchmark]
        public double Seri2FileE()
        {
            DateTime tmpStartTime = System.DateTime.Now;
            for (int i = 1; i < _loopMaxTime; i++)
            {
                _log2File.Error($"Serilog error {i}");
            }
            Log.CloseAndFlush();
            DateTime tmpEndTime = System.DateTime.Now;
            TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);
            return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);
        }


        [Benchmark]
        public double Stream2File()
        {
            DateTime tmpStartTime = System.DateTime.Now;
            for (int i = 1; i < _loopMaxTime; i++)
            {
                _sw2File.WriteLine($"{tmpStartTime.ToString()}.077 +08:00 [ERR] Stream Writer {i}");
            }
            _sw2File.Flush();
            DateTime tmpEndTime = System.DateTime.Now;
            TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);
            return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);
        }

        [Benchmark]
        public double Stream2Console()
        {
            DateTime tmpStartTime = System.DateTime.Now;
            for (int i = 1; i < _loopMaxTime; i++)
            {
                Console.WriteLine($"{tmpStartTime.ToString()}.077 +08:00 [ERR] Console Write {i}");
            }
            DateTime tmpEndTime = System.DateTime.Now;
            TimeSpan tmpTimeCost = tmpEndTime.Subtract(tmpStartTime);
            return Math.Round(tmpTimeCost.TotalMilliseconds, 2, MidpointRounding.AwayFromZero);
        }

        public static void main()
        {
            var summary = BenchmarkRunner.Run<Program>();
            /*
            double SeriConcolsErrorCost = Seri2ConsoleE();
            double SeriConcolsInfoCost = Seri2ConsoleI();
            double SeriFileErrorCost = Seri2FileE();
            double SeriFileInfoCost = Seri2FileI();
            double SystConsoleInfoCost = Stream2Console();
            double SystFileInfoCost = Stream2File();
            Console.WriteLine($"[To Console]:\n" +
                              $"    Seri info: { SeriConcolsInfoCost }ms\n" +
                              $"    Seri err: { SeriConcolsErrorCost }ms\n" +
                              $"    Sys output: { SystConsoleInfoCost }ms\n" +
                              $"[To file]:\n" +
                              $"    Seri info: { SeriFileInfoCost }ms\n" +
                              $"    Seri error: { SeriFileErrorCost }ms\n" +
                              $"    Sys output: { SystFileInfoCost }ms\n");
            */
        }
    }
}

运行结果如下:
在这里插入图片描述
结果日志也会保存在新生成的BenchmarkDotNet.Artifacts目录中。

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

皓月如我

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值