锁定老帖子 主题:JRuby 性能问题(结果很意外)
精华帖 (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) 声明:ITeye文章版权属于作者,受法律保护。没有作者书面许可不得转载。
推荐链接
|
|
返回顶楼 | |
发表时间:2009-02-16
我在Windows下面CRuby要比JRuby快很多啊
实验环境:Windows 7 Beta 、JRE6u12 、JRuby1.1.4 、 Ruby1.8.6 |
|
返回顶楼 | |
发表时间:2009-02-17
benchmark的话,多运行几次,你会发现有时候结果波动很大的。
第一次的结果别太在意,第一次运行的时候load dll什么的占的时间很多。 |
|
返回顶楼 | |
发表时间: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慢许多.....?? |
|
返回顶楼 | |
浏览 3479 次