本文不讲C#开发技巧,只测试同样的代码在不同CPU的机器上的运行速度。结果包括普通版本和并行版本的对比,方便大家选配电脑,对“性能”有个感性的认识。

一. 测试原理

字符串相关度计算是文本处理和数据挖掘中一个不可或缺的方法,例如论文查重等。Levenshtein Distance可以用来比较两个字符串的相似度,即两个字符串之间的“距离”。这个“距离”其实就是从源字符串变换到目标字符串需要进行的删除、插入和替换的次数。

有不少该算法的改进版本,可大幅度提升效率,不过这不是本文的目的。我们的目的就是看看该算法在不同的机器下到底能跑多快,再看并行优化后又能跑多快。该算法基本只对CPU性能敏感,很适合做测试。

我们随机生成1000个1000长度的字符串,并比较字符串相关度。示例工程可在文末找到,由于需要并行计算,需要VS2010,.NET4.0支持。

代码如下:

namespace SpeedTest
{using System;using System.Diagnostics;using System.Text;using System.Threading.Tasks;internal class Program{#region Methodsprivate static void Main(string[] args){var  watch =new Stopwatch();const long count = 1000;const int length = 1000;string comparestring = StringDistance.GenerateRandomString(length);var strlist = new string[count];var steps = new int[count];// prepare string[] for comparison  Parallel.For(0, count, i => strlist[i] = StringDistance.GenerateRandomString(length));Console.WriteLine("已经生成了" + count + "个长度为" + length + "的字符串");watch.Start();for (int i = 0; i < count; i++){steps[i] = StringDistance.LevenshteinDistance(comparestring, strlist[i]);}watch.Stop();Console.WriteLine("完成非并行计算,耗时(ms)"+watch.ElapsedMilliseconds);Console.WriteLine("性能比" + 100000d/watch.ElapsedMilliseconds);watch.Reset();watch.Start();Parallel.For(0, count, delegate(long i) { steps[i] = StringDistance.LevenshteinDistance(comparestring, strlist[i]); });watch.Stop();Console.WriteLine("完成并行计算,耗时(ms)" + watch.ElapsedMilliseconds);Console.WriteLine("性能比" + 100000d / watch.ElapsedMilliseconds);Console.ReadKey();}#endregion}internal class StringDistance{#region Public Methodspublic static string GenerateRandomString(int length){var r = new Random((int)DateTime.Now.Ticks);var sb = new StringBuilder(length);for (int i = 0; i < length; i++){int c = r.Next(97, 123);sb.Append(Char.ConvertFromUtf32(c));}return sb.ToString();}public static int LevenshteinDistance(string str1, string str2){var scratchDistanceMatrix = new int[str1.Length + 1,str2.Length + 1];// distance matrix contains one extra row and column for the seed values         for (int i = 0; i <= str1.Length; i++){scratchDistanceMatrix[i, 0] = i;}for (int j = 0; j <= str2.Length; j++){scratchDistanceMatrix[0, j] = j;}for (int i = 1; i <= str1.Length; i++){int str1Index = i - 1;for (int j = 1; j <= str2.Length; j++){int str2Index = j - 1;int cost = (str1[str1Index] == str2[str2Index]) ? 0 : 1;int deletion = (i == 0) ? 1 : scratchDistanceMatrix[i - 1, j] + 1;int insertion = (j == 0) ? 1 : scratchDistanceMatrix[i, j - 1] + 1;int substitution = (i == 0 || j == 0) ? cost : scratchDistanceMatrix[i - 1, j - 1] + cost;scratchDistanceMatrix[i, j] = Math.Min(Math.Min(deletion, insertion), substitution);// Check for Transposition  if (i > 1 && j > 1 && (str1[str1Index] == str2[str2Index - 1]) &&(str1[str1Index - 1] == str2[str2Index])){scratchDistanceMatrix[i, j] = Math.Min(scratchDistanceMatrix[i, j], scratchDistanceMatrix[i - 2, j - 2] + cost);}}}// Levenshtein distance is the bottom right element       return scratchDistanceMatrix[str1.Length, str2.Length];}#endregion}
}

废话不说,上测试结果。

二.测试结果

1. Debug,Debug直接运行,Release调试,Release直接运行的区别

以上四种环境对应不同开发阶段的软件性能,对开发的性能调优有指导价值。

电脑配置如下:

测试结果如下,数值为执行时间,单位为ms

值得注意的是,在不同代码下四种环境的结果是很不相同的。一般情况下软件直接运行要比调试快很多。Release模式比Debug模式快几倍。但在这个示例下,直接运行和调试却没有特别明显的区别,希望大神能给予解答。

另外,并行算法比普通的串行算法快了四倍。符合四核CPU的实际情况。

2.不同CPU下的性能

接下来,我们来看不同CPU下的性能区别。为简化测试,以下所有结果都采用Release运行模式。对比不同CPU在串行/并行下的速度区别。

结果都是以执行时间ms表示的,值越小越好。

古老电脑AMD QL-62 双核心 2.00GHz

难得找到AMD的笔记本电脑,该CPU已经停产很久了,三年前的CPU不负众望,成绩还不错,当然并行成绩比服务器慢了十几倍。

笔记本T8100,双核2.4G

I3 2310 笔记本核心,双核,2.1GHz

虽然比T8100的频率低,但新一代酷睿I3还是完虐T8100的。

桌面老牌酷睿E7300 双核心2.67GHz

回想06年底,能买到酷睿E6300是刚上高三的我最大的梦想,现在看来是在不敢恭维,并行速度和I7比差了四倍不止。这款当时很牛的桌面CPU连现在低端的笔记本CPU都不如。

华硕笔记本UX31A, I5 3317U   双核双线程, @2.3GHz Auto OC

超级本的性能还是不错的,也体现出了双核的优势。在“节能模式”下,CPU不会自动睿频,只有1.7GHz。结果惨不忍睹。超级本一般情况下做开发足够了。

第二代酷睿笔记本I5 2430 @ 2.3GHz

不得不说,标压笔记本的I5都可以完虐超低压的I7.  谁让超级本必须做到那么薄呢? 价格还死贵。如果考虑性能和性价比,还是选标压CPU吧。

联想台式机 I3 2130 @3.4GHz

虽然是I3,但在串行下与同频的I7几乎无区别,当然由于是双核的,并行速度正好是串行的一半。

I7 2600 四核八线程  3.4GHz

实在没有找到2600K的超频结果,就先用2600默频凑数吧,单核性能中规中矩。

I5 2500K OC 4.2GHz 四核四线程

寝室台式机的跑分,看来频率是王道啊,在4.2G轻松秒杀I7 2600。

服务器核心X5670  六核心 @2.93Ghz

服务器六核心CPU看似高端,但在这个程序下,还是无法与2600甚至2130抗衡,并行加速比4.66, 六核心有点小吃亏。

服务器核心E5 2690 8核心,双CPU共16核心, 2.9GHz *2

这几乎是我目前看到的最好结果, 该CPU在串行模式下就达到了11.657s的水平,并行加速比达到了可喜的7.32。可是与2500K这样的CPU不对等的是它的售价,一万三四够买10个2500K了。

3. 测试总结和对比

下图是不同CPU串行速度的对比图:

我们看到基本上同平台,同架构的CPU间,频率是王道。而当前I3新酷睿都可以干掉当年桌面的老酷睿经典,不得不说技术发展迅速。而服务器核心虽然核心多,甚至是双CPU,但频率一般,因此在这种普通应用下甚至抗不过桌面的I5 2500K。 能多核优化的程序还是占少数,大家能超就超一点吧,超频带来的性能提升真心不是一点点。

下图是并行下速度对比图:

并行计算下,核的数量是王道!在非服务器核心上,加速比几乎就是CPU核心数。四核的速度就是比双核的快。在八核的顶级服务器CPU上,它的速度几乎是AMD QL-62的13倍!但若算是这台机器有双CPU16个核心的话,加速比和16还是差很多的。难道.NET并行库对多CPU支持不好?我怎么记得它可以支持最多64个CPU?

三. 总结和源代码下载

咱不是专业的硬件测评师,只是好奇之下跑了几个分数看了他们的性能而已,花了整整一晚上时间,因此若有不足之处还请海涵。

总体来说,单核性能频率和架构决定一切,多核性能上核心数决定了加速比。 桌面级应用完全没必要买服务器的多核心(E3 1230这类除外)。大部分程序最多只对四核CPU做过优化。更多核心甚至双CPU会造成各种不兼容性问题,连游戏都打不了(嘿嘿),编程都卡。

现在觉得,I5 2500K还是要比E3 1230性价比高很多,超频超出来的性能不是盖的。别担心寿命,它只会在需要的时候睿频到更高的频率,平时都是乖乖的二点几吉赫兹。而且非常简单!Enjoy it!

程序并行的优势还是非常明显的,.NET的并行库可比Intel并行库方便多了(虽然效率不能比),但它可以很好的帮助你挖掘多核CPU的潜力。大家可以多学习一下.NET并行库。

源代码下载

C#版本的CPU性能测试相关推荐

  1. 服务器cpu性能如何测试,CPU性能测试(1)_服务器评测与技术-中关村在线

    在测试之前,我们有必要交代下这次测试的操作系统环境.通过缓存为512MB的LSI MegaRAID 2208 SAS阵列卡,对四块300GB 15K转速的SAS硬盘组建RAID5,在此基础上我们选择了 ...

  2. CPU性能测试基准(Dhrystone)学习

    目录 简介 源码获取 缺陷 简介 Dhrystone是测量处理器运算能力的最常见基准程序之一,常用于处理器的整型运算性能的测量.程序是用C语言编写的,因此C编译器的编译效率对测试结果也有很大影响. D ...

  3. 痞子衡嵌入式:微处理器CPU性能测试基准(Dhrystone)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是微处理器CPU性能测试基准Dhrystone. 在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone.MIPS.C ...

  4. 性能测试sysbench之cpu性能测试

    1.sysbench安装: yum install sysbench 2.测试cpu的性能指标  第一次:sysbench cpu run 表示使用一个thread执行一次cpu性能测试;测试结果如下 ...

  5. amd锐龙笔记本cpu怎么样_amd锐龙处理器5怎么样?AMD锐龙5 1600X1500X CPU性能测试

    AMD 2月底的锐龙 7 CPU无疑是相当有亮点,不过2000元起的售价也成了普及的一大门槛.相对来说,中高端装机点名率最高的应该就是i5-7500和i7-7700K,AMD并没有第一时间推出对应的产 ...

  6. 微控制器CPU性能测试基准CoreMark

    origin:https://www.cnblogs.com/henjay724/p/8729364.html 痞子衡嵌入式:微控制器CPU性能测试基准(EEMBC-CoreMark) 大家好,我是痞 ...

  7. 痞子衡嵌入式:微控制器CPU性能测试基准(EEMBC-CoreMark)

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是微控制器CPU性能测试基准CoreMark. 在嵌入式系统行业用于评价CPU性能指标的标准主要有三种:Dhrystone.MIPS.Co ...

  8. Sysbench性能测试(二): sysbench基本使用和CPU性能测试

    Sysbench性能测试 传送门: Sysbench性能测试(一): sysbench简介与安装 Sysbench性能测试(二): sysbench基本使用和CPU性能测试 Sysbench性能测试( ...

  9. Java 获取操作系统名字、系统版本、cpu信息

    Java 获取操作系统名字.系统版本.cpu信息 System.getProperty("os.name");//得到操作系统名字 System.getProperty(" ...

最新文章

  1. VMware上实现LVS负载均衡(NAT)
  2. 基于3D的结构光的应用
  3. String性能提升10倍的几个方法!(源码+原理分析)
  4. 【 FPGA 】FIR滤波器之 Hilbert 变换的实现
  5. .NET全栈开发工程师学习路径
  6. Linux vim进入编辑模式
  7. 详细描述一下 Elasticsearch 更新和删除文档的过程。
  8. Markdown Cookbook by Eric
  9. python 批量修改文件名
  10. Java读取URL到字符串
  11. 如何升级更新你的黑莓手机OS系统
  12. IBM人工智能项目Watson旧金山开设新总部
  13. art-记一次提取mmd模型到max和unity
  14. 如何在Word中绘制流程图
  15. 十、PWM脉宽调制信号的发生与控制
  16. c语言公历转农历程序,公历和农历之间如何转换?
  17. XTransfer外贸收款账户是如何收费的?
  18. Java 中的三角函数
  19. 哎,又跟HR在小群吵了一架!
  20. 积分电路中并联RC的原因竟然是这个!

热门文章

  1. Java微服务 vs Go微服务,究竟谁更强!?
  2. 刚入职,就被各种 Code Review,真的有必要吗?
  3. 面试官:Java 到底是值传递还是引用传递?
  4. 面试:你知道Java中的回调机制吗?
  5. spring cloud gateway之服务注册与发现
  6. 春节假期是弯道超车的好机会!
  7. 「数据分析」之零基础入门数据挖掘
  8. 太强了!我怀疑这是京东V1版源码....
  9. NumPy迎来重大版本更新
  10. 100年前的北京Vlog火了!大神利用AI修复古董纪录片,还原1920年的京城生活