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

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

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 版本后看到的跟刚才控制台的是一样的

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


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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/321705.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

24、jdbc操作数据库(1)

什么是jdbc&#xff1f; 看一下官方怎么说&#xff0c;JDBC 英文名Java DataBase Connectivity&#xff0c;使用java连接数据库的工具&#xff0c;就是一组使用java代码来执行SQL语句的API。 Jdbc有什么用&#xff1f; 数据库有多种&#xff0c;并且不同数据库操作时的方式和…

jzoj3918-蛋糕【二分】

正题 题目链接:https://jzoj.net/senior/#contest/show/2953/0 题目大意 n∗mn*mn∗m的矩阵&#xff0c;有数字&#xff0c;横着三刀竖着三刀分成16份使得最小那份最大。 解题思路 暴力枚举竖着的三刀&#xff0c;然后二分答案判定即可。 codecodecode #include<cstdio&g…

2017西安交大ACM小学期数论 [阅兵式]

阅兵式 发布时间: 2017年6月25日 12:53 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 阅兵式上&#xff0c;将士们排成一个整齐的方阵&#xff0c;每个将士面朝前方。问正中心的将士能向前看到几个将士&#xff1f;注意&#xff0c;一条直线上的将…

25、jdbc操作数据库(2)

说一下使用jdbc时涉及到的一些基本的接口和类 java.sql.Driver 是数据库驱动接口&#xff0c;com.mysql.jdbc.Driver是mysql对应的驱动&#xff0c;由数据库供应商实现&#xff0c;用于提供驱动&#xff0c;实现了java.sql.Driver接口。 java.sql.DriverManager 管理驱动的…

jzoj3919-志愿者【换根法,线段树,树形dp】

正题 题目链接:https://jzoj.net/senior/#main/show/3919 题目大意 nnn个点kkk个需要到达的点&#xff0c;然后求每个点出发经过这些点的最短路径。 解题思路 因为不用回去&#xff0c;答案就是以这点为根链接所有点的树减去离这个点最远点的距离。 我们用线段树维护最远点距…

2017西安交大ACM小学期数论 [水题]

水题 发布时间: 2017年6月25日 14:06 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 平均因数个数的统计对于估算数论题目复杂度具有非常重要的意义。小A同学听了今天的课后&#xff0c;于是想要自己写一个程序&#xff0c;求出1到n的平均因数个数…

26、jdbc操作数据库(3)

1、结果集的元数据操作 ResultSetMetaData 是描述ResultSet的元数据对象&#xff0c;可以通过元数据对象获取结果集的列信息&#xff0c;使用方式如下&#xff1a; public void query() {Connection connection DBUtil.getConnection();String sql "SELECT ID,UNAME u,…

jzoj3920-噪音【贪心,dp】

正题 题目链接:https://jzoj.net/senior/#main/show/3920 题目链接 nnn头牛&#xff0c;mmm个牛棚&#xff0c;可以清空kkk次。 每头牛会指定进入一个牛棚&#xff0c;进入后产生牛棚中牛数量的噪音值&#xff0c;然后清空可以清空一个牛棚的牛&#xff0c;求最少噪音值。 解…

2017西安交大ACM小学期数论 [完全平方数]

完全平方数 发布时间: 2017年6月24日 17:01 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 给定正整数b&#xff0c;求最大的整数a&#xff0c;使a(ab)是完全平方数。 输入 多组测试数据&#xff08;不超过10000组&#xff09;。 每组数据一个正整…

27、jdbc操作数据库(4)

数据库连接池是什么&#xff1f;为什么使用连接池&#xff1f; 当使用jdbc去操作数据库时&#xff0c;需要先获取连接&#xff0c;然后进行具体的数据库操作&#xff0c;最后释放连接。这一系列操作在演示一个demo时还可以使用&#xff0c;但是当访问数据库次数多了的时候&…

28、jdbc操作数据库(5)

介绍一个稍微封装了jdbc的工具类org.apache.commons.dbutils&#xff0c;使用dbutils可以简化对数据库操作程序的开发。 API介绍 接下来通过实例的方式说一下dbutils的具体使用 添加jar包&#xff1a;commons-dbutils-1.7.jar 增、删、改 进行增、删、改操作&#xff0c;在…

jzoj3910-Idiot的间谍网络【倍增,dfs】

正题 题目链接:https://jzoj.net/senior/#main/show/3910 题目大意 nnn个点的森林mmm个操作&#xff0c; 合并两棵树让xxx节点到根节点的路径标记上cntcntcnt。并让cntcntcnt查询一个节点xxx是否有标记yyy。 解题思路 这里考虑离线的算法。我们可以先将这个森林的最终状态构…

2017西安交大ACM小学期数论 [更新学号]

发布时间: 2017年6月24日 20:27 最后更新: 2017年7月3日 09:27 时间限制: 3000ms 内存限制: 128M 描述 某知名高校有n个学生&#xff0c;每个学生有一个唯一ID。但这些ID有7位数字&#xff0c;学生总是记不住&#xff0c;于是学校想了一个办法。它们将所有ID对m取模作为学…

jzoj4815-ksum【堆】

正题 题目链接:https://jzoj.net/senior/#main/show/4815 题目大意 nnn个数的序列&#xff0c;求前kkk大的子段。 解题思路 一个区间的答案肯定比他的所有子区间要大&#xff0c;所以我们先把(1,i)(1,i)(1,i)都丢进堆里&#xff0c;然后每次取出最大的再将(l1,r)(l1,r)(l1,r)…

2017西安交大ACM小学期数论 [等差数列]

等差数列 发布时间: 2017年6月25日 13:42 最后更新: 2017年7月3日 09:27 时间限制: 1000ms 内存限制: 128M 描述 给定正整数n&#xff0c;试问存在多少个和为n的等差数列&#xff1f; 当然&#xff0c;等差数列中每一项要为非负整数&#xff0c;且不考虑降序的等差数列。…

29、jdbc操作数据库(6)

通常真正实际开发时&#xff0c;dao层虽然会涉及很多实体&#xff0c;但是可以借助泛型、反射、一些简单工具类来封装一些通用的查询、更新等操作的方法&#xff0c;下面介绍两种方法 第一种&#xff1a;借助元数据类ResultSetMetaData来实现方法的封装&#xff0c;使用Map或者…

30、JAVA_WEB开发基础之servlet(1)

servlet是什么 Servlet 是一种独立的 web 开发标准&#xff0c;用来接受、处理、返回浏览器的访问请求&#xff0c;它不应和服务器耦合在一起&#xff0c;servlet和servlet容器之间相互独立又相互依存&#xff0c;自我感觉&#xff0c;servlet有了容器才得以实现自己的价值&am…

jzoj4817-square【区间RMQ,二分答案】

正题 题目链接:https://jzoj.net/senior/#contest/show/2956/2 题目大意 n∗mn*mn∗m的010101矩阵&#xff0c;每次询问(x1,y1,x2,y2)(x1,y1,x2,y2)(x1,y1,x2,y2)里的最大全111正方形。 解题思路 我们用fi,jf_{i,j}fi,j​表示以(i,j)(i,j)(i,j)为右下角的全1正方形大小&#…

2017上海金马五校赛 丢史蒂芬妮 博弈问题

丢史蒂芬妮 发布时间: 2017年7月9日 18:17 最后更新: 2017年7月9日 21:05 时间限制: 1000ms 内存限制: 128M 描述 有一天&#xff0c;空和白很无聊&#xff0c;决定玩盛大游戏&#xff0c;考虑到两个人玩&#xff0c;他们随便掏了一个游戏出来&#xff1a;在一个n*m的棋盘…

2017上海金马五校 购买装备 贪心+二分Check

购买装备 发布时间: 2017年7月9日 18:17 最后更新: 2017年7月9日 21:05 时间限制: 1000ms 内存限制: 128M 描述 最近盛大的一款游戏传奇世界极其火爆。游戏玩家John&#xff0c;想购买游戏中的装备。已知游戏的商店里有n件装备&#xff0c;第i件装备具有属性值ai&#xf…