我想知道我们是否可以用一些基于ARM的设备(我们喜欢无风扇设置,功耗等)来替换运行Rails(ruby 1.8.6 ......)webapp的基于Atom N270的nettop。
ARM设备是XScale-PXA270 @ 520,128MB(可能还有一些较慢的SDRAM),运行linux,总有足够的可用内存,性能与越狱的iPhone相当。
对生产数据库(SQLite)进行基准测试给了我们很有希望的结果(ARM只慢了20-30%),所以我尝试构建ruby(1.9.2p0)。
rails应用程序在ARM上运行速度非常慢(从sql获取并生成10-20倍速的模板)。我已经决定运行一些基准来找到瓶颈。
再次,一些结果是可以的(与我们现在使用的旧红宝石1.8.6相比,比红宝石1.9.2慢6倍),有些非常慢(慢20-30倍)。铁。它看起来散列方法在ARM上慢了40倍。运行Ruby Benchmark Suite显示更多的瓶颈,字符串,线程,数组......
我知道ARM比Atom慢,我只是没想到会有这么大的差异,特别是在SQLite运行正常之后。
在ARM上有一些Ruby漏洞,我是否需要应用一些补丁,如果我想使用ARM设备或只是设备没有足够的计算能力,这是否无望并且应该用C重写整个应用程序?
例子
def fib(n)
return 1 if n < 2
fib(n-1)+fib(n-2)
end
Benchmark.bm do |x|
x.report { fib(32) }
x.report { fib(36) }
x.report { h = {}; (0..10**3).each {|i| h[i] = i} }
x.report { h = {}; (0..10**4).each {|i| h[i] = i} }
x.report { h = {}; (0..10**5).each {|i| h[i] = i} }
end
ruby -rbenchmark bench.rb
Atom N270,1GB
ruby 1.9.2p0 (2010-08-18) [i686-linux] user system total real 2.440000 0.000000 2.440000 ( 2.459400) 16.780000 0.030000 16.810000 ( 17.293015) 0.000000 0.000000 0.000000 ( 0.001180) 0.020000 0.000000 0.020000 ( 0.012180) 0.160000 0.000000 0.160000 ( 0.161803) ruby 1.8.6 (2008-08-11 patchlevel 287) [i686-linux] user system total real 12.500000 0.020000 12.520000 ( 12.628106) 84.450000 0.170000 84.620000 ( 85.879380) 0.010000 0.000000 0.010000 ( 0.002216) 0.040000 0.000000 0.040000 ( 0.032939) 0.240000 0.010000 0.250000 ( 0.255756)
XScale-PXA270 @ 520,128MB ruby 1.9.2p0(2010-08-18)[arm-linux]
user system total real 12.470000 0.000000 12.470000 ( 12.526507) 85.480000 0.000000 85.480000 ( 85.939294) 0.060000 0.000000 0.060000 ( 0.060643) 0.640000 0.000000 0.640000 ( 0.642136) 6.460000 0.130000 6.590000 ( 6.605553)
建立:
./configure --host=arm-linux --without-X11 --disable-largefile \ --enable-socket=yes --without-Win32API --disable-ipv6 \ --disable-install-doc --prefix=/opt --with-openssl-include=/opt/include/ \ --with-openssl-lib=/opt/include/lib ENV: PFX=arm-iwmmxt-linux-gnueabi export DISCIMAGE="/opt" export CROSS_COMPILE="arm-linux-" export HOST="arm-linux" export TARGET="arm-linux" export CROSS_COMPILING=1 export CC=$PFX-gcc export CFLAGS="-O3 -I/opt/include" export LDFLAGS="-O3 -L/opt/lib/" #LIBS= #CPPFLAGS= export CXX=$PFX-g++ #CXXFLAGS= export CPP=$PFX-cpp export OBJCOPY="$PFX-objcopy" export LD="$PFX-ld" export AR="$PFX-ar" export RANLIB="$PFX-ranlib" export NM="$PFX-nm" export STRIP="$PFX-strip" export ac_cv_func_setpgrp_void=yes export ac_cv_func_isinf=no export ac_cv_func_isnan=no export ac_cv_func_finite=no
看来你抱怨Ruby 1.9.2中的新优化(与1.8.x相比)是特定于x86的。对于Ruby 1.8.x,Atom和ARM的性能相当。也许你可以问一个特定于ruby的邮件列表。快速搜索显示是的,Ruby 1.9.x中有很多变化:
Ruby 1.9.2通过Yet Another Ruby VM(YARV)解释器为Ruby带来了重大的速度提升
也许正确的问题是“YARV是否具有x86特定优化?这些优化是否可以在ARM端口中重复?”
关于覆盆子pi的相同基准测试,包含更新的软件包:
pi@raspberrypi:~$ uname -a
Linux raspberrypi 3.6.11+
pi@raspberrypi:~$ ruby -v
ruby 2.0.0p195 (2013-05-14 revision 40734) [armv6l-linux-eabihf]
pi@raspberrypi:~$ ruby benchmark.rb
user system total real
6.580000 0.000000 6.580000 ( 6.585575)
45.080000 0.000000 45.080000 ( 45.132900)
0.000000 0.000000 0.000000 ( 0.008709)
0.090000 0.000000 0.090000 ( 0.095851)
1.040000 0.010000 1.050000 ( 1.044347)
RP2更新(2015年):
pi@raschpi ~ $ uname -a
Linux raschpi 4.1.13-v7+ #826 SMP PREEMPT Fri Nov 13 20:19:03 GMT 2015 armv7l GNU/Linux
pi@raschpi ~ $ ruby -v
ruby 2.2.1p85 (2015-02-26 revision 49769) [armv7l-linux-eabihf]
pi@raschpi ~ $ ruby benchmark.rb
user system total real
4.450000 0.000000 4.450000 ( 4.446841)
30.460000 0.000000 30.460000 ( 30.473665)
0.010000 0.000000 0.010000 ( 0.002306)
0.020000 0.000000 0.020000 ( 0.023236)
0.290000 0.000000 0.290000 ( 0.292746)
更新RP 3-B(2017年 - Raspbian Jessie):
pi@raspberrypi:~ $ uname -a
Linux raspberrypi 4.9.59-v7+ #1047 SMP Sun Oct 29 12:19:23 GMT 2017 armv7l GNU/Linux
pi@raspberrypi:~ $ ruby -v
ruby 2.3.3p222 (2016-11-21) [arm-linux-gnueabihf]
pi@raspberrypi:~ $ ruby -rbenchmark benchmark.rb
user system total real
4.030000 0.000000 4.030000 ( 4.032046)
30.940000 0.000000 30.940000 ( 30.943480)
0.000000 0.000000 0.000000 ( 0.001352)
0.000000 0.010000 0.010000 ( 0.013266)
0.260000 0.000000 0.260000 ( 0.251937)
使用问题示例中引用的代码,这些是我在使用armv6l处理器运行Raspbian的Raspberry Pi上的结果:
uname -a
Linux ginger 3.1.9+ #168 PREEMPT Sat Jul 14 18:56:31 BST 2012 armv6l GNU/Linux
ruby -v
ruby 1.9.3p194 (2012-04-20 revision 35410) [armv6l-linux-eabi]
ruby benchmark.rb
user system total real
7.810000 0.000000 7.810000 ( 7.823737)
53.520000 0.010000 53.530000 ( 53.630399)
0.010000 0.000000 0.010000 ( 0.007818)
0.090000 0.000000 0.090000 ( 0.090667)
0.950000 0.030000 0.980000 ( 0.980731)