论坛首页 编程语言技术论坛

JRuby 性能问题(结果很意外)

浏览 3479 次
精华帖 (0) :: 良好帖 (0) :: 新手帖 (0) :: 隐藏帖 (0)
作者 正文
   发表时间:2009-02-16   最后修改:2009-03-16

[2.16号9:20分修正eval测试方法和结果]

 

 

前几天试着把一个Rails应用移植到JRuby上来(见http://www.iteye.com/topic/328081),过程还算顺利,可在部署到生产环境时,却发现性能下降很多,尤其是在服务器竟比在我的开发机上运行还要慢2倍,百思不得其解。

 

 

     举例来说,有一个action,在nginx+mongerl+ruby1.8.7的配置下,响应时间一般在100ms左右,在我的开发机上(windows xp),glassfish gem+jruby1.1.6+jdk1.6.0_10,用时230ms,在服务器上(linux64,4cpu,16Gmemory),glassfish v3+jruby1.1.6+jdk1.6.0_12,响应时间居然达到450ms左右。

 

 

     我试了很多方法,包括调整jvm参数,更换jdk版本,war部署换成目录方式部署等,都不管用。这不禁让我产生怀疑,是不是jruby在linux下就比在windows下慢呢?但常识告诉我,这是不太可能的。所以我做了一个很简单的测试,就用ruby自带的benchmark测几个常用操作的速度,结果却很让人意外,下面是我的估算结果:

 

 

    1.windows 下 jruby 至少比 cruby快 80%以上

    2. windows 下 jruby 用  server模式会比平常快 80%

    3.linux64下用64位的jdk,jruby竟然比window下要慢 30%以上,(eval慢50%以上)而且用不用server模式似乎对性能影响很小。

    4. linux64位下用32位的jdk跑jruby,不用server模式时会很慢,比cruby还慢。不过在server模式下和64位的jdk差不多。

    5.jruby的eval调用比cruby要慢4-5倍,而我的程序中用到了很多eval,所以速度下降的很历害。 

 

 

我知道我的测试方法不是很科学,但至少反映了一些事实。 结果虽然出来了,可我仍然很困惑。为什么jruby在linux下会比 windows下慢呢,更何况服务器的配置比我的开发机高这么多。请各位经验丰富的高手帮我分析分析,是不是哪里问题?

   下面贴出我的测试代码和结果

 

 

require 'benchmark'
array = (1..1000000).map { rand }

Benchmark.bmbm do |x|
    x.report("sort!") { array.dup.sort! }
    x.report("sort")  { array.dup.sort  }
    x.report("string") {"xxx"*10000000}
    x.report("eval") {1.upto(100000){eval("12*10000000.floor")}}
end

 

 

 

------------------------------------------------------------------
ruby 1.8.7, jruby 1.1.6 性能测试
------------------------------------------------------------------

###################################################################
#windows xp,cpu:E2180,MEM:2G, jdk 1.6.0_10
###################################################################
C:\>ruby d:\download\bm.rb
             user     system      total        real
sort!    4.703000   0.000000   4.703000 (  4.781000)
sort     4.782000   0.000000   4.782000 (  4.797000)
string   0.328000   0.000000   0.328000 (  0.344000)
eval     0.766000   0.000000   0.766000 (  0.766000)

C:\>jruby d:\download\bm.rb
             user     system      total        real
sort!    5.140000   0.000000   5.140000 (  5.132454)
sort     5.047000   0.000000   5.047000 (  5.040419)
string   0.046000   0.000000   0.046000 (  0.042275)
eval     3.032000   0.000000   3.032000 (  3.028174)

C:\>jruby --server d:\download\bm.rb
             user     system      total        real
sort!    2.907000   0.000000   2.907000 (  2.904988)
sort     2.937000   0.000000   2.937000 (  2.934093)
string   0.031000   0.000000   0.031000 (  0.035711)
eval     2.562000   0.000000   2.562000 (  2.565979)


############################################################
#LINUX 2.6.9-55 x86_64, CPU:AMD 2216HE*4, MEM:16G,jdk1.6.0_12 64位
############################################################
[tomcat@localhost glassfishv3-prelude]$ jruby bm.rb
             user     system      total        real
sort!    3.511000   0.000000   3.511000 (  3.511263)
sort     3.507000   0.000000   3.507000 (  3.506745)
string   0.044000   0.000000   0.044000 (  0.043611)
[tomcat@localhost glassfishv3-prelude]$ jruby --server bm.rb
             user     system      total        real
sort!    3.809000   0.000000   3.809000 (  3.808292)
sort     3.656000   0.000000   3.656000 (  3.656613)
string   0.049000   0.000000   0.049000 (  0.048788)
 
############################################################
#LINUX 2.6.9-55 x86_64, CPU:AMD 2216HE*4, MEM:16G, jdk1.6.0_12 32位
############################################################
[tomcat@localhost glassfishv3-prelude]$ jruby bm.rb
             user     system      total        real
sort!    6.198000   0.000000   6.198000 (  6.198902)
sort     5.923000   0.000000   5.923000 (  5.923057)
string   0.041000   0.000000   0.041000 (  0.040446)
eval     3.742000   0.000000   3.742000 (  3.742658)
[tomcat@localhost glassfishv3-prelude]$ jruby --server  bm.rb
             user     system      total        real
sort!    3.872000   0.000000   3.872000 (  3.872495)
sort     3.758000   0.000000   3.758000 (  3.757683)
string   0.041000   0.000000   0.041000 (  0.041261)
eval     3.722000   0.000000   3.722000 (  3.722523)
   发表时间:2009-02-16  
我在Windows下面CRuby要比JRuby快很多啊

实验环境:Windows 7 Beta 、JRE6u12 、JRuby1.1.4 、 Ruby1.8.6
0 请登录后投票
   发表时间:2009-02-17  
benchmark的话,多运行几次,你会发现有时候结果波动很大的。

第一次的结果别太在意,第一次运行的时候load dll什么的占的时间很多。

0 请登录后投票
   发表时间:2009-02-17   最后修改:2009-02-17
被benchmark的部分应该不受load dll之类的影响,而且banchmark本身会先演练一次,JVM的优化也应该起作用了。

只是lz的是在不同机器下测试的,因此“jruby在linux下会比 windows下慢“的结论未必中肯。对于简单的benchmark测试,16G内存对于2G内存一点优势也没有。

我也贴一下在我的机器上的测试结果:
---------- ruby 1.9.1p0 (2009-01-30 revision 21907) [i686-linux] ------------
             user     system      total        real
sort!    2.580000   0.000000   2.580000 (  2.573333)
sort     2.520000   0.000000   2.520000 (  2.536174)
string   0.050000   0.010000   0.060000 (  0.093509)
eval     1.030000   0.000000   1.030000 (  1.037494)


---------- ruby 1.8.7 (2008-08-11 patchlevel 72) [i686-linux] -------------
             user     system      total        real
sort!    2.850000   0.010000   2.860000 (  2.892889)
sort     2.970000   0.010000   2.980000 (  2.976728)
string   0.360000   0.010000   0.370000 (  0.369591)
eval     0.370000   0.000000   0.370000 (  0.366916)


---------- jruby 1.1.4 (ruby 1.8.6 patchlevel 114) (2008-08-28 rev 7570) [i386-java] -----
---------- Java(TM) SE Runtime Environment (build 1.6.0_10-b33) -----

             user     system      total        real
sort!    2.279000   0.000000   2.279000 (  2.279086)
sort     2.250000   0.000000   2.250000 (  2.249125)
string   0.179000   0.000000   0.179000 (  0.179039)
eval     2.519000   0.000000   2.519000 (  2.519190)


意外的是,ruby1.9.1p0的eval测试居然比ruby1.8.7慢许多.....??
0 请登录后投票
论坛首页 编程语言技术版

跳转论坛:
Global site tag (gtag.js) - Google Analytics