使用 BenchmarkDotnet 测试代码性能

先来点题外话,清明节前把工作辞了(去 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。

使用 BenchmarkDotnet 测试代码性能_第1张图片

安装完成后编写如下代码:

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();
        Console.ReadLine();
    }
}

最后将 Debug 调成 Release 模式,不调试启动。

稍微等待一会儿就会出现结果了。

使用 BenchmarkDotnet 测试代码性能_第2张图片

结论是 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.0TargetFramework>

一行改为

<TargetFrameworks>netcoreapp2.0;net471TargetFrameworks>

回到 VS 重新编译,还原 nuget 包。

不调试启动。稍等片刻。

使用 BenchmarkDotnet 测试代码性能_第3张图片

可见在 .net framework 环境下,仍然是 MD5 比 SHA1 快的。而且可以看见 .net core 比 .net framework 环境下快了很多。

另外在输出目录下,BenchmarkDotnet 会输出性能测试结果文件:

QQ截图20180408230657

打开 html 版本后看到的跟刚才控制台的是一样的

使用 BenchmarkDotnet 测试代码性能_第4张图片

你可能感兴趣的:(使用 BenchmarkDotnet 测试代码性能)