hhhj 发表于 2013-2-7 03:51:42

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


 
 
前几天试着把一个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      realsort!    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      realsort!    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      realsort!    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位############################################################$ jruby bm.rb             user   system      total      realsort!    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)$ jruby --server bm.rb             user   system      total      realsort!    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位############################################################$ jruby bm.rb             user   system      total      realsort!    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)$ jruby --serverbm.rb             user   system      total      realsort!    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)
页: [1]
查看完整版本: JRuby 性能问题(结果很意外)