先来点题外话,清明节前把工作辞了(去 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> 类型,里面就可以执行我们需要测试的异步方法了。

使用 BenchmarkDotnet 测试代码性能 【Win10】单元测试中捕获异步方法的指定异常的更多相关文章

  1. 【Win10】单元测试中捕获异步方法的指定异常

    温馨提醒:本文需要知道什么是单元测试才能阅读. 在之前 WPF.ASP.NET 中,单元测试要捕捉指定异常,我们是通过 ExpectedExceptionAttribute 来实现的.如下图: 但是, ...

  2. 使用 BenchmarkDotnet 测试代码性能

    先来点题外话,清明节前把工作辞了(去 tm 的垃圾团队,各种拉帮结派.勾心斗角).这次找工作就得慢慢找了,不能急了,希望能找到个好团队,好岗位吧.顺便这段时间也算是比较闲,也能学习一下和填掉手上的坑. ...

  3. 使用Benchmark.NET测试代码性能

    今天,我们将研究如何使用Benchmark.Net来测试代码性能.借助基准测试,我们可以创建基准来验证所做的更改是否按预期工作并且不会导致性能下降. 并非每个项目都需要进行基准测试,但是如果您正在开发 ...

  4. .NET单元测试的艺术-3.测试代码

    开篇:上一篇我们学习单元测试和核心技术:存根.模拟对象和隔离框架,它们是我们进行高质量单元测试的技术基础.本篇会集中在管理和组织单元测试的技术,以及如何确保在真实项目中进行高质量的单元测试. 系列目录 ...

  5. Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询

    Visual Studio Entity Framework (EF) 生成SQL 代码 性能查询     SQL 中,有SQL Server Profiler可以用来查询性能以及查看外部调用的SQL ...

  6. Maven打包时过滤测试代码或指定特定的测试类(maven-surefire-plugin)

    1.过滤整个测试代码,可以直接在命令行上指定 mvn clean install -Dmaven.test.skip=true 提示:以上为举例,具体的构建阶段可以自定义,其中maven.test.s ...

  7. 利用BenchmarkDotNet 测试 .Net Core API 同步和异步方法性能

    事由: 这两天mentor给我布置了个任务让我用BenchmarkDotNet工具去测试一下同一个API 用同步和异步方法写性能上有什么差别. 顺带提一下: 啊啊啊啊 等我仔细看文档的时候文档 发现它 ...

  8. iOS开发:XCTest单元测试(附上一个单例的测试代码)

    测试驱动开发并不是一个很新鲜的概念了.在我最开始学习程序编写时,最喜欢干的事情就是编写一段代码,然后运行观察结果是否正确.我所学习第一门语言是c语言,用的最多的是在算法设计上,那时候最常做的事情就是编 ...

  9. 性能秒杀log4net的NLogger日志组件(附测试代码与NLogger源码)

    NLogger特性: 一:不依赖于第三方插件和支持.net2.0 二:支持多线程高并发 三:读写双缓冲对列 四:自定义日志缓冲大小 五:支持即时触发刷盘机制 六:先按日期再按文件大小滚动Rolling ...

随机推荐

  1. C#根據當前DataGridView查詢數據導出Excel

    private void btnsuggestinfo_Click(object sender, EventArgs e) { DataTable dt = new DataTable(); dt.C ...

  2. vue面试相关

    (1)什么是mvvm?    MVVM是Model-View-ViewModel的缩写.mvvm是一种设计思想.Model 层代表数据模型,也可以在Model中定义数据修改和操作的业务逻辑:View ...

  3. note for git

    1.download https://git-for-windows.github.io/ 2.command add file to git: git add filename & git ...

  4. [Python3网络爬虫开发实战] 2.1-HTTP基本原理

    在本节中,我们会详细了解HTTP的基本原理,了解在浏览器中敲入URL到获取网页内容之间发生了什么.了解了这些内容,有助于我们进一步了解爬虫的基本原理. 1. URI和URL 这里我们先了解一下URI和 ...

  5. jQuery中四个绑定事件的区别 on,bind,live,delegate

    1.jQ操作DOM元素的绑定事件的四种方式       jQ中提供了四种事件监听方式,bind.live.delegate.on,对应的解除监听的函数分别是unbind,die,undelegate, ...

  6. 【转】SQLServer连接字符串配置:MultipleActiveResultSets

    ADO.NET 1.x 利用SqlDataReader读取数据,针对每个结果集需要一个独立的连接.当然,你还必须管理这些连接并且要付出相应的内存和潜在的应用程序中的高度拥挤的瓶颈代价-特别是在数据集中 ...

  7. BNUOJ 1585 Girls and Boys

    Girls and Boys Time Limit: 5000ms Memory Limit: 10000KB This problem will be judged on PKU. Original ...

  8. cdq分治入门--BZOJ1176: [Balkan2007]Mokia

    对w*w,w<=2000000的矩形,一开始全是0(或一开始全是s),n<=170000个操作,每次操作:矩阵内某点加上一个数,查某一个子矩阵的和,保证修改数<=160000,询问数 ...

  9. Help Jimmy DP

    Help Jimmy" 是在下图所示的场景上完成的游戏. 场景中包括多个长度和高度各不相同的平台.地面是最低的平台,高度为零,长度无限. Jimmy老鼠在时刻0从高于所有平台的某处开始下落, ...

  10. Ubuntu 16.04硬盘有坏道,开机显示blk_update_request:I/0 error

    可以尝试以下方式解决: 1.检查坏道(效果明显,但是比较慢,检查出来并没有什么用,只是知道有坏块) sudo badblocks -s -v -o /root/bb.log /dev/sda1 2.快 ...