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

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

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

这有点奇怪吗?为什么当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

以下只是程序的输出

在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

2.53GHz Intel Core 2 Duo:(更新:Macbook标识符:MacBookPro5,4,因此可能是英特尔酷睿2双核Penryn与3 MB片上二级缓存)

$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

测试在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"

英特尔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

英特尔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

为什么i7与2.67GHz的速度比2.53GHz的Core 2 Duo要慢一些也是奇怪的.

解决方法

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

引用Fixnum ruby​​ doc:

A Fixnum holds Integer values that can
be represented in a native machine
word
(minus 1 bit). If any operation
on a Fixnum exceeds this range,the
value is automatically converted to a
Bignum.

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

相关文章

validates:conclusion,:presence=>true,:inclusion=>{...
一、redis集群搭建redis3.0以前,提供了Sentinel工具来监控各...
分享一下我老师大神的人工智能教程。零基础!通俗易懂!风趣...
上一篇博文 ruby传参之引用类型 里边定义了一个方法名 mo...
一编程与编程语言 什么是编程语言? 能够被计算机所识别的表...
Ruby类和对象Ruby是一种完美的面向对象编程语言。面向对象编...