本文不讲c#开发技巧,只测试同样的代码在不同cpu的机器上的运行速度。结果包括普通版本和并行版本的对比,方便大家选配电脑,对“性能”有个感性的认识。
字符串相关度计算是文本处理和数据挖掘中一个不可或缺的方法,例如论文查重等。levenshtein distance可以用来比较两个字符串的相似度,即两个字符串之间的“距离”。这个“距离”其实就是从源字符串变换到目标字符串需要进行的删除、插入和替换的次数。
有不少该算法的改进版本,可大幅度提升效率,不过这不是本文的目的。我们的目的就是看看该算法在不同的机器下到底能跑多快,再看并行优化后又能跑多快。该算法基本只对cpu性能敏感,很适合做测试。
我们随机生成1000个1000长度的字符串,并比较字符串相关度。示例工程可在文末找到,由于需要并行计算,需要vs2010,.net4.0支持。
代码如下:
废话不说,上测试结果。
以上四种环境对应不同开发阶段的软件性能,对开发的性能调优有指导价值。
电脑配置如下:
测试结果如下,数值为执行时间,单位为ms
值得注意的是,在不同代码下四种环境的结果是很不相同的。一般情况下软件直接运行要比调试快很多。release模式比debug模式快几倍。但在这个示例下,直接运行和调试却没有特别明显的区别,希望大神能给予解答。
另外,并行算法比普通的串行算法快了四倍。符合四核cpu的实际情况。
接下来,我们来看不同cpu下的性能区别。为简化测试,以下所有结果都采用release运行模式。对比不同cpu在串行/并行下的速度区别。
结果都是以执行时间ms表示的,值越小越好。
难得找到amd的笔记本电脑,该cpu已经停产很久了,三年前的cpu不负众望,成绩还不错,当然并行成绩比服务器慢了十几倍。
虽然比t8100的频率低,但新一代酷睿i3还是完虐t8100的。
回想06年底,能买到酷睿e6300是刚上高三的我最大的梦想,现在看来是在不敢恭维,并行速度和i7比差了四倍不止。这款当时很牛的桌面cpu连现在低端的笔记本cpu都不如。
超级本的性能还是不错的,也体现出了双核的优势。在“节能模式”下,cpu不会自动睿频,只有1.7ghz。结果惨不忍睹。超级本一般情况下做开发足够了。
不得不说,标压笔记本的i5都可以完虐超低压的i7. 谁让超级本必须做到那么薄呢? 价格还死贵。如果考虑性能和性价比,还是选标压cpu吧。
虽然是i3,但在串行下与同频的i7几乎无区别,当然由于是双核的,并行速度正好是串行的一半。
实在没有找到2600k的超频结果,就先用2600默频凑数吧,单核性能中规中矩。
寝室台式机的跑分,看来频率是王道啊,在4.2g轻松秒杀i7 2600。
服务器六核心cpu看似高端,但在这个程序下,还是无法与2600甚至2130抗衡,并行加速比4.66, 六核心有点小吃亏。
这几乎是我目前看到的最好结果, 该cpu在串行模式下就达到了11.657s的水平,并行加速比达到了可喜的7.32。可是与2500k这样的cpu不对等的是它的售价,一万三四够买10个2500k了。
下图是不同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并行库。