使用 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。

640?wx_fmt=png

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

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 模式,不调试启动。

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

640?wx_fmt=png

结论是 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 包。

不调试启动。稍等片刻。

640?wx_fmt=png

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

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

640?wx_fmt=png

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

640?wx_fmt=png

原文地址 http://www.cnblogs.com/h82258652/p/8748345.html


.NET社区新闻,深度好文,欢迎访问公众号文章汇总 http://www.csharpkit.com

640?wx_fmt=jpeg

展开阅读全文

没有更多推荐了,返回首页