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

nop*_*ole 9 ruby performance

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

以下程序需要3.6秒才能在拥有2.2GHz Core 2 Duo的Macbook上运行,并且在拥有2.53GHz Core 2 Duo的Macbook Pro上运行需要1.8秒.这是为什么?

这有点奇怪...当CPU的时钟速度仅快15%时为什么速度加倍?我仔细检查了CPU计量器,以确保2个核心都没有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
Run Code Online (Sandbox Code Playgroud)

以下是该程序的输出:

在2.2GHz Core 2 Duo :( 更新: Macbook标识符:MacBook3,1,因此可能是Intel Core 2 Duo(T7300/T7500))

$ time ruby 1.rb
"1.9.2"
"ruby 1.9.2p0 (2010-08-18 revision 29036) [i386-darwin9.8.0]"
9999999
23333331666668

real  0m3.784s
user  0m3.751s
sys  0m0.021s
Run Code Online (Sandbox Code Playgroud)

2.53GHz Intel Core 2 Duo :( 更新: Macbook标识符:MacBookPro5,4,因此可能是Intel Core 2 Duo Penryn,带有3 MB片上L2缓存)

$ time ruby 1.rb
"1.9.2"
"ruby 1.9.2p0 (2010-08-18 revision 29036) [x86_64-darwin10.4.0]"
9999999
23333331666668

real  0m1.893s
user  0m1.809s
sys  0m0.012s
Run Code Online (Sandbox Code Playgroud)

在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"
Run Code Online (Sandbox Code Playgroud)

英特尔Q6600四核2.4GHz运行Windows 7,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
Run Code Online (Sandbox Code Playgroud)

英特尔920 i7 2.67GHz运行Windows 7,64位:

C:\> ruby try.rb
"1.9.2"
"ruby 1.9.2p0 (2010-08-18) [i386-mingw32]"
9999999
23333331666668
Took 2.044117 seconds to run
Run Code Online (Sandbox Code Playgroud)

同样奇怪的是,2.67GHz的i7比2.53GHz的Core 2 Duo慢.

erg*_*sys 12

我怀疑ruby后来在64位操作系统上切换到任意精度整数实现.

引用Fixnum ruby​​ doc:

Fixnum保存可以在本机机器字(减1位)中表示的整数值.如果Fixnum上的任何操作超出此范围,则该值将自动转换为Bignum.

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