【发布时间】:2010-10-27 12:46:28
【问题描述】:
我想知道我们是否可以用一些等效的基于 ARM 的设备(我们喜欢无风扇设置、功耗等)替换运行 Rails(ruby 1.8.6...)webapp 的基于 Atom N270 的网络机。
ARM 设备是 XScale-PXA270 @ 520、128MB(可能还有一些较慢的 SDRAM),运行 linux,总是有足够的可用内存,性能与越狱 iPhone 相当。
对生产数据库 (SQLite) 进行基准测试为我们带来了可喜的结果(ARM 只是 慢 20-30%),所以我尝试构建 ruby (1.9.2p0)。
rails 应用在 ARM 上运行非常缓慢(从 sql 获取并生成模板慢 10-20 倍)。我决定运行一些基准测试来发现瓶颈。
同样,有些结果还可以(与我们现在使用的旧 ruby 1.8.6 相当,比 ruby 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
红宝石 1.9.2p0 (2010-08-18) [i686-linux] 用户系统总真实 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 补丁级别 287) [i686-linux] 用户系统总真实 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 红宝石 1.9.2p0 (2010-08-18) [arm-linux]
用户系统总真实 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 环境: PFX=arm-iwmmxt-linux-gnueabi 导出 DISCIMAGE="/opt" 导出 CROSS_COMPILE="arm-linux-" 出口主机=“arm-linux” 导出目标="arm-linux" 导出 CROSS_COMPILING=1 导出 CC=$PFX-gcc 导出 CFLAGS="-O3 -I/opt/include" 导出 LDFLAGS="-O3 -L/opt/lib/" #LIBS= #CPPFLAGS= 导出 CXX=$PFX-g++ #CXXFLAGS= 导出 CPP=$PFX-cpp 导出 OBJCOPY="$PFX-objcopy" 出口 LD="$PFX-ld" 出口 AR="$PFX-ar" 出口 RANLIB="$PFX-ranlib" 出口纳米=“$PFX-纳米” 导出 STRIP="$PFX-strip" 导出 ac_cv_func_setpgrp_void=yes 导出 ac_cv_func_isinf=no 导出 ac_cv_func_isnan=no 导出 ac_cv_func_finite=no【问题讨论】:
-
为什么将 nettops 作为生产服务器运行?你应该有一个真正的服务器和网络终端连接来浏览网络应用程序,你不应该在网络终端上本地运行网络应用程序编辑如果你在谈论开发机器参考the programmer's bill of rights
-
我注意到带有“ruby”标签的问题通常只有 10-20 次浏览,所以这里的 ruby 社区很小。在我的“答案”中,我建议去一个邮件列表。
标签: ruby-on-rails ruby performance arm