为什么有些Ruby代码在2.53GHz上的运行速度是在2.2GHz Core 2 Duo处理器上的两倍?
(这个问题试图找出为什么程序在不同处理器上的运行可能不同,因此它与编程的性能方面有关。) 以下程序在具有2.2GHz Core 2 Duo的Macbook上运行需要3.6秒,在具有2.53GHz Core 2 Duo的Macbook Pro上运行需要1.8秒。为什么呢 这有点奇怪。。。当CPU的时钟速度仅快15%时,为什么要将速度加倍?我仔细检查了CPU表,以确保这两个核心都没有100%的使用率(以便看到CPU没有忙于运行其他东西)。可能是因为一个是Mac OS X Leopard,另一个是Mac OS X Snow Leopard(64位)?两者都运行Ruby 1.9.2为什么有些Ruby代码在2.53GHz上的运行速度是在2.2GHz Core 2 Duo处理器上的两倍?,ruby,performance,Ruby,Performance,(这个问题试图找出为什么程序在不同处理器上的运行可能不同,因此它与编程的性能方面有关。) 以下程序在具有2.2GHz Core 2 Duo的Macbook上运行需要3.6秒,在具有2.53GHz Core 2 Duo的Macbook Pro上运行需要1.8秒。为什么呢 这有点奇怪。。。当CPU的时钟速度仅快15%时,为什么要将速度加倍?我仔细检查了CPU表,以确保这两个核心都没有100%的使用率(以便看到CPU没有忙于运行其他东西)。可能是因为一个是Mac OS X Leopard,另一个是Ma
p RUBY_VERSION
p RUBY_DESCRIPTION if defined? RUBY_DESCRIPTION
n = 9_999_999
p n
t = 0; 1.upto(n) {|i| t += i if i%3==0 || i%5==0}; p t
以下只是程序的输出:
在2.2GHz Core 2 Duo上:(更新:Macbook标识符:MacBook3,1,因此可能是Intel Core 2 Duo(T7300/T7500))
2.53GHz Intel Core 2 Duo:(更新:Macbook标识符:MacBookPro5,4,因此可能是具有3 MB片上二级缓存的Intel Core 2 Duo Penryn)
Windows 7上的测试运行:
time_start = Time.now
p RUBY_VERSION
p RUBY_DESCRIPTION if defined? RUBY_DESCRIPTION
n = 9_999_999
p n
t = 0; 1.upto(n) {|i| t += i if i%3==0 || i%5==0}; p t
print "Took #{Time.now - time_start} seconds to run\n"
运行Windows 7的英特尔Q6600四核2.4GHz,64位:
C:\> ruby try.rb
"1.9.2"
"ruby 1.9.2p0 (2010-08-18) [i386-mingw32]"
9999999
23333331666668
Took 3.248186 seconds to run
C:\> ruby try.rb
"1.9.2"
"ruby 1.9.2p0 (2010-08-18) [i386-mingw32]"
9999999
23333331666668
Took 2.044117 seconds to run
运行Windows 7的英特尔920 i7 2.67GHz,64位:
C:\> ruby try.rb
"1.9.2"
"ruby 1.9.2p0 (2010-08-18) [i386-mingw32]"
9999999
23333331666668
Took 3.248186 seconds to run
C:\> ruby try.rb
"1.9.2"
"ruby 1.9.2p0 (2010-08-18) [i386-mingw32]"
9999999
23333331666668
Took 2.044117 seconds to run
同样奇怪的是,为什么2.67GHz的i7要比2.53GHz的Core2Duo慢
当CPU的时钟速度仅快15%时,为什么要将速度加倍
很简单,因为计算机的性能不仅仅取决于CPU时钟速度
其他需要考虑的事情是:
- CPU体系结构,包括CPU上的内核数量,或并行运行多条指令的一般能力
- 系统中的其他时钟速度(内存、FSB)
- CPU缓存大小
- 已安装的内存芯片(一些比其他更快)
- 额外安装的硬件(可能会因硬件中断而降低系统速度)
- 不同的操作系统
- 32位与64位系统
我相信上面的清单还有很多东西要补充。我将不再详细说明这一点,但如果有人愿意,请随时添加到上面的列表中。没有阅读代码,但是。。在两台不同的计算机上进行测试真的很难。 您需要完全相同的操作系统、相同的进程、相同的内存量
如果更改处理器系列(i7、core2due、P4、P4-D)-处理器频率对每个处理器相对于另一个系列的能力没有任何影响。您只能在同一系列中进行比较(例如,较新的处理器可能会在核心管理而不是计算方面投入周期)在out CI环境中,我们有许多“pizza box”计算机,它们应该是相同的。它们具有相同的硬件,同时安装,并且应该大体相同。它们甚至被放置在“热当量”的位置。它们并不完全相同,而且变化可能相当惊人 我得出的唯一结论是,CPU的不同组合将有不同的热步进阈值;一些“最好”的芯片更耐用。我还怀疑其他“轻微”硬件故障/变化在这里起作用。也许慢盒的组件稍有不同,但在一起玩得不太好
有一些工具可以告诉你你的CPU是否因为热的原因而节流。我对Ruby了解不多,但是你的代码看起来不是多线程的,如果是这样的话,它就不会利用多核。两种CPU型号之间也可能存在很大差异。您有更小的进程大小、更大的缓存、更好的SIMD指令集、更快的内存访问等等。。。编译器和操作系统的差异会导致Windows和Linux之间的性能大幅波动,这也可以说是x86和x64之间的差异。加上核心i7s支持超线程,这在某些情况下会使单线程应用程序速度变慢 举个例子,如果该2.2Ghz CPU是Intel Core2 E4500,则其规格如下:
- 时钟:2.2Ghz
- 二级缓存:2MB
- 金融稳定委员会:800公吨/秒
- 工艺尺寸:65nm
- 时钟:2.53Ghz
- 二级缓存:6MB
- FSB:1066MT/秒
- 工艺尺寸:45nm
另外,您正在Darwin的x64版本上运行它。所有这些事情加起来肯定会让一个微不足道的小脚本执行得更快。我怀疑ruby正在转向一个任意精度的整数实现 稍后在64位操作系统上 引用Fixnum ruby文档: Fixnum包含可以修改的整数值 在本机计算机中表示 字(减1位)。如果有手术 在Fixnum超过此范围时 值将自动转换为 Bignum
在这里,本机机器字在技术上是64位的,但解释器被编译为在32位处理器上运行 我知道这不仅仅取决于时钟的速度。但为什么要加倍?具体原因是什么?看到了您在编辑中添加的内容。但是这种程序在双核上比在四核上运行得更快,内存总线并不是那么重要,正如我看到的,在Ruby上,它只使用3MB的RAM,主循环可能使用不到几kb,所以一级缓存应该远远高于要求@動靜能量, 我这里的主要观点并不是要找出速度差的确切或最可能的原因——我对你们的测试机器了解得不够。相反,我想说的是,这些天来,有太多的因素影响着性能,直接比较几乎不容易,甚至没有意义,尤其是对一个程序来说。而且,很容易就被针对一台特定机器的代码优化所困扰。。。而你的代码在另一个系统上运行的速度会变慢说了这么多,我