zoukankan      html  css  js  c++  java
  • 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能

    事由:

    这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别。

    顺带提一下:

    啊啊啊啊 等我仔细看文档的时候文档 发现它让我用Release的模式去运行benchmark。 emmm...其实我之前一直在用Debug模式调试。。

    所以各位在运行的时候,The best way is build our benchmark in the Release mode and run it from the command line.

    过程:

    首先 我们需要在Nuget上安装BenchMarkDotNet

    (安装当前最新版本,当前我已经安装好了)

    但是却安装失败出现两个error。

    其中一个是

     

    第二个

    ok,第二个错误非常显眼,那我先尝试着按照它的说法解决  我边在Nuget上找到 Microsoft.CodeAnalysis.CSharp 2.8.2 ,Microsoft.CodeAnalysis.Common (= 2.8.2)  我安装的都是2.8.2的版本 但是其实这两个包都有更新的版本。安装完毕后 发现错误消失了,却跳出几个警告。(对后面的测试没有影响就先不搭理)

    安装完,上述两个包后 再回去安装 BenchmarkDotNet 终于安装成功了。

    Ok此时我们在新建一个Console.App ,命名为BenchMarkDotNetTest

    在API层把需要的方法 前加上[Benchmark] 引用BenchmarkDotNet.Attributes;

    注意:原来的方法中是有参数的,但是这里不允许有参数,我就把方法的入参和值直接写到方法里面去了。

    这2个方法都在UserImpelement 类中所以我们在Main方法中这样写

     static void Main(string[] args)
            {
                var summary = BenchmarkRunner.Run<UserImpelement>();
          //var summary = BenchmarkRunner.Run(typeof(UserImpelement))//当然也可以这么写 Console.WriteLine(
    "-----------------"); Console.WriteLine(summary); Console.ReadKey(); }

    点击运行,emmm,错误又来了

     

    在百度上搜索了,但是未能找到结果,于是就去Bing上搜索

    GitHub上有回复

    https://github.com/dotnet/BenchmarkDotNet/issues/579

    (当然官方文档也有回答)

    Ok 根据解决方案 我们新创建了AllowNonOptimazed类

    运行的summary改成

    var summary = BenchmarkRunner.Run<UserImpelement>(new AllowNonOptimized());

    再次运行,运行开始。 运行需要一点时间

    可以看到运行大概花费了1分52秒

    总结果如下

    我运行了多次每一次的数据都有变化,响应速度上也是有时CheckLogin快 有时AsyncCheckLogin更快些

     我们还能在BenchMarkDotNetTestinDebug etcoreapp2.1BenchmarkDotNet.Artifacts esults中看到输出结果的XLS ,MD和HTML文件

    当前截图是我运行了2次的结果所以有两张XSL表格

    点开HTML文件可以看到也是一样就是本次性能测试的Summary

    而打开表格的时候则会有更多详细的性能数据显示

    可是我对这些性能指标很陌生,至少我们初步的看一下他们代表什么有什么意义

    // * Legends *

      Mean   : Arithmetic mean of all measurements

      Error  : Half of 99.9% confidence interval

      StdDev : Standard deviation of all measurements

      1 ms   : 1 Millisecond (0.001 sec)

     

    Mean: 可以反映响应时长

    StdDev:事务处理响应的偏差,值越大,偏差越大;

    Median:中值响应时间

    confidence interval:置信区间 (展现这个参数的真实值有一定概率落在测量结果的周围的程度)

    补充:

    话说,我同样的情况下运行4次,只有1次出现了中值 其他三次都没有。

    后来发现其实在类前加上 [MinColumn, MaxColumn, MedianColumn]

    返回结果里就会多输出Min, Max, Media。

     

     

    从每一次的运行测试结果上看也是五五开- - 我想会不会是当前接口逻辑太简单了呢所以很难得出结果,那ok我们再来多测试几个接口

    (这次我换了另一个.Net Core API项目)

    那我们对三组方法进行测试(同样的方法内容用同步和异步处理)

    分别为

    login(登录)

    ReturnClient(返回管理员用户信息)

    loadImg(加载头像信息)

    按照同样的步骤进行操作,运行

    这个项目进行测试这一次测试耗时非常短(39秒)

    上述结果而言 其实同步的响应时间通常快于异步(当然其实我不是特别确信我的判断)

    ok进行第二组测试

    第三组

    第四组

    emmm...果然还是有波动的。

    所以我测试了很多组数据,但是想去比较个究竟,却感觉自己似乎进入了误区了。

    我现在刚刚大四,技术不是非常好,还是希望各位大牛提提意见。

    这些性能指标具体代表些什么,又如何去反应代码的性能优劣呢?

    还有我这样去比较同步和异步的方法性能是否正确呢 ,为什么我看不出个所以然呢?

     补充:

    BenchmarkDotNet官方文档 https://benchmarkdotnet.org/articles/guides/getting-started.html

  • 相关阅读:
    Door man
    Borg Maze
    Agri-Net
    Highways
    Truck History
    Arctic Network
    QS Network
    用贝塞尔曲线实现水波效果
    在一个Label上设置多种颜色字体
    用UIImageView作出动画效果
  • 原文地址:https://www.cnblogs.com/RikuBlog/p/9686876.html
Copyright © 2011-2022 走看看