使用 BenchmarkDotnet 测试代码性能 【Win10】单元测试中捕获异步方法的指定异常
先来点题外话,清明节前把工作辞了(去 tm 的垃圾团队,各种拉帮结派、勾心斗角)。这次找工作就得慢慢找了,不能急了,希望能找到个好团队,好岗位吧。顺便这段时间也算是比较闲,也能学习一下和填掉手上的坑。
说实话好久没写博客了,一个是手上的工作确实忙,第二个是还有各种各样的坑。写本文的原因也是因为手上的一个坑——ImageEx,WPF/UWP 上的图片缓存控件。
在我写的这个图片缓存控件中,其中有一个地方就是要根据图片的 url 地址,然后来存储或者获取本地的图片文件的。但是呢,我们不可能把 url 当作本地文件的文件名的,一个是可能包含非法字符(如斜杠),另一个是长度可能超出限制。想了一下,那就只能用哈希(hash)来解决了,其中 MD5 和 SHA1 两种算法我觉得都可以解决这个问题。但问题是,哪一个更好、更快呢?传统经验告诉我是 MD5,但是我觉得还是有必要手动实践一下,毕竟没有 100% 的把握。
先编写出如下的代码:
public static class HashHelper { public static string GetMD5(string input) { if (input == null) { throw new ArgumentNullException(nameof(input)); } using (var md5 = MD5.Create()) { var buffer = Encoding.UTF8.GetBytes(input); var hashResult = md5.ComputeHash(buffer); return BitConverter.ToString(hashResult).Replace("-", string.Empty); } } public static string GetSHA1(string input) { if (input == null) { throw new ArgumentNullException(nameof(input)); } using (var sha1 = SHA1.Create()) { var buffer = Encoding.UTF8.GetBytes(input); var hashResult = sha1.ComputeHash(buffer); return BitConverter.ToString(hashResult).Replace("-", string.Empty); } } }
作用是输入一个字符串,输出一个哈希后的字符串。
建立一个 .net core 的控制台项目,我就叫 TestBenchmarkDotnet。
然后安装 nuget 包,BenchmarkDotnet。
安装完成后编写如下代码:
public class TestContext { [Benchmark] public void TestMD5() { HashHelper.GetMD5("https://www.baidu.com/img/bd_logo1.png"); } [Benchmark] public void TestSHA1() { HashHelper.GetSHA1("https://www.baidu.com/img/bd_logo1.png"); } }
然后修改 Main 方法:
public class Program { public static void Main(string[] args) { Summary summary = BenchmarkRunner.Run<TestContext>(); Console.ReadLine(); } }
最后将 Debug 调成 Release 模式,不调试启动。
稍微等待一会儿就会出现结果了。
结论是 MD5 确实比 SHA1 快。
另外由于这是在 .net core 下的测试结果,而 WPF 是跑在 .net framework 下的,那么是否结果可能不一样呢?
Benchmark 支持多个 .net 环境的性能测试(.net framework, net core, mono)。
修改 TestContext 类的代码:
[ClrJob, CoreJob] public class TestContext { [Benchmark] public void TestMD5() { HashHelper.GetMD5("https://www.baidu.com/img/bd_logo1.png"); } [Benchmark] public void TestSHA1() { HashHelper.GetSHA1("https://www.baidu.com/img/bd_logo1.png"); } }
添加了 ClrJob 和 CoreJob 两个标签
然后修改项目的 csproj 文件
将
<TargetFramework>netcoreapp2.0</TargetFramework>
一行改为
<TargetFrameworks>netcoreapp2.0;net471</TargetFrameworks>
回到 VS 重新编译,还原 nuget 包。
不调试启动。稍等片刻。
可见在 .net framework 环境下,仍然是 MD5 比 SHA1 快的。而且可以看见 .net core 比 .net framework 环境下快了很多。
另外在输出目录下,BenchmarkDotnet 会输出性能测试结果文件:
打开 html 版本后看到的跟刚才控制台的是一样的
温馨提醒:本文需要知道什么是单元测试才能阅读。
在之前 WPF、ASP.NET 中,单元测试要捕捉指定异常,我们是通过 ExpectedExceptionAttribute 来实现的。如下图:
但是,在 UWP 的单元测试项目中,是没有 ExpectedExceptionAttribute 的(没想到不同平台,M$ 连单元测试的 API 都改-_-|||)。那难道只能写个 try-catch,然后检测 Exception 类型是否符合吗?这样写起来未免有些繁琐了。最终,我在另一个命名空间发现了另一个 Assert 类。。。
Microsoft.VisualStudio.TestPlatform.UnitTestFramework.AppContainer.Assert。有够长的。。。然后这个类就只有 ThrowsException 这个方法(它有三个重载)。三个重载第一个参数都是 Func<Task> 类型,里面就可以执行我们需要测试的异步方法了。
- 【Win10】单元测试中捕获异步方法的指定异常
- 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能
- 1 开发一个注重性能的JDBC应用程序不是一件容易的事. 当你的代码运行很慢的时候JDBC驱动程序并不会抛出异常告诉你。 本系列的性能提示将为改善JDBC应用程序的性能介绍一些基本的指导原则,这其中的原则已经被许多现有的JDBC应用程序编译运行并验证过。 这些指导原则包括: 正确的使用数据库MetaData方法 只获取需要的数据 选用最佳性能的功能 管理连
- 【GoLang】GoLang 单元测试、性能测试使用方法
- 简单的代码片段性能测试 -- 顺便测一下正则和异常的性能(使用循环测试做比较)
- 在C/C++代码中使用SSE等指令集的指令(5)SSE进行加法运算简单的性能测试
- 使用unixbench测试你VPS性能的方法
- 使用ASP.NET AJAX异步调用Web Service和页面中的类方法(2):处理异步调用中的异常
- 在C/C++代码中使用SSE等指令集的指令(5)SSE进行加法运算简单的性能测试
- 性能测试监控工具nmon安装及使用方法
- Win7下的使用QTP进行猴子测试的性能日志实现方法
- 一种简单的代码性能测试方法
- Iperf 带宽性能测试使用方法与参数说明
- 嵌入式开发中网络性能测试工具iperf的使用方法和注意事项
- 消除 bug 三种方法:代码复查、单元测试、系统测试
- .“在JAVA中,异常子类必须在它们任何父类之前使用,因为运用父类的catch语句将捕获该类型及其所有子类类型的异常。这样,后面运行子类的catch语句将永远不会到达。而且,Java中不能到达的代码是一个错误。”
- Loadrunner录制使用ajax性能测试脚本方法
- 关于Windows 8 开发之测试代码的使用方法
- 如何使用单元测试 测试WEB组件方法中的含有Session、Cookie等HttpContext功能调用的方法? 转
- 单元测试-使用nmock测试你的.NET代码(1)