Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/ruby/24.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为什么有些Ruby代码在2.53GHz上的运行速度是在2.2GHz Core 2 Duo处理器上的两倍?_Ruby_Performance - Fatal编程技术网

为什么有些Ruby代码在2.53GHz上的运行速度是在2.2GHz Core 2 Duo处理器上的两倍?

为什么有些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

(这个问题试图找出为什么程序在不同处理器上的运行可能不同,因此它与编程的性能方面有关。)

以下程序在具有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

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
与您的MacBook Pro中可能的T9400相比

  • 时钟:2.53Ghz
  • 二级缓存:6MB
  • FSB:1066MT/秒
  • 工艺尺寸:45nm

另外,您正在Darwin的x64版本上运行它。所有这些事情加起来肯定会让一个微不足道的小脚本执行得更快。

我怀疑ruby正在转向一个任意精度的整数实现 稍后在64位操作系统上

引用Fixnum ruby文档:

Fixnum包含可以修改的整数值 在本机计算机中表示 字(减1位)。如果有手术 在Fixnum超过此范围时 值将自动转换为 Bignum


在这里,本机机器字在技术上是64位的,但解释器被编译为在32位处理器上运行

我知道这不仅仅取决于时钟的速度。但为什么要加倍?具体原因是什么?看到了您在编辑中添加的内容。但是这种程序在双核上比在四核上运行得更快,内存总线并不是那么重要,正如我看到的,在Ruby上,它只使用3MB的RAM,主循环可能使用不到几kb,所以一级缓存应该远远高于要求@動靜能量, 我这里的主要观点并不是要找出速度差的确切或最可能的原因——我对你们的测试机器了解得不够。相反,我想说的是,这些天来,有太多的因素影响着性能,直接比较几乎不容易,甚至没有意义,尤其是对一个程序来说。而且,很容易就被针对一台特定机器的代码优化所困扰。。。而你的代码在另一个系统上运行的速度会变慢说了这么多,我