[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 01:11
- 浏览 2493
- 评论(3)
- 论坛回复 / 浏览 (3 / 3480)
- 查看更多
相关推荐
JRuby 是一个开源的、高性能的 Ruby 解释器,它能够将 Ruby 代码编译成 Java 字节码,从而在 Java 虚拟机(JVM)上运行。JRuby 的出现使得 Ruby 开发者能够利用 JVM 的强大功能和丰富的库,同时也让 Java 开发者能够...
回到“jruby-src-1.0.zip”这个压缩包,其中包含的“jruby-1.0”文件夹很可能是整个JRuby 1.0源代码结构的根目录。通过解压并查看这些源代码,开发者可以深入理解JRuby的内部工作原理,包括其解析器、编译器、运行时...
- **Web应用开发**:与Rails框架结合,JRuby可以构建高性能的Web应用程序,利用JVM的并发能力和大量的Java中间件。 - **测试自动化**:由于JRuby可以在JVM上运行,它也常被用作自动化测试的工具,例如与JUnit集成...
JRuby 是一种 Java 实现的 Ruby 解释器,它允许 Ruby 代码在 JVM(Java 虚拟机)上运行,从而利用 Java 平台的性能和生态系统。 【知识点一:JRuby 基础】 1. JRuby 定义:JRuby 是 Ruby 语言的一个开源实现,它的...
尽管理论上 JRuby 1.1.1 可能与 JDK 1.4 兼容,但为了确保稳定性和最佳性能,还是推荐使用官方建议的 JDK 版本。 **二、获取 JRuby 和 JDK** 1. **下载 JRuby**: 你可以从官方网站获取 JRuby 的最新版本,例如 ...
通过这些监控数据,开发者可以深入了解JRuby脚本的运行性能,及时发现和解决潜在的性能问题,提升应用的整体效率。记住,监控是持续优化的关键步骤,对于理解和改善代码执行效率有着至关重要的作用。
然而,由于其原生解释器是用C语言编写的,它在某些场景下可能无法充分利用现代多核处理器的性能,或者无法很好地融入Java平台的生态系统。这就是JRuby的出现原因,它是一个将Ruby语言实现于Java虚拟机(JVM)上的...
3. **性能提升**:由于JRuby运行在JVM上,它可以利用JVM的优化技术,如Just-In-Time(JIT)编译,从而提高运行效率。 4. **Rails支持**:对于Web开发,JRuby支持Ruby on Rails框架,可以在Windows环境下搭建高效...
它不仅保留了Ruby语言简洁且强大的特性,还充分利用了Java平台的强大功能,如性能优化、垃圾回收机制等。由于Ruby本身具备高度的面向对象编程能力以及灵活的语法结构,这使得它在编写测试脚本时变得非常高效。 ####...
1. **性能提升**:由于JRuby运行在JVM上,它能够利用JVM的优化技术,如即时编译(JIT),提高运行速度,尤其对于计算密集型任务,JRuby的性能通常优于纯Ruby解释器。 2. **兼容性**:JRuby可以调用Java类库,这意味...
标题 "jruby-1.5.5+OperaWatir+RSpec" 暗示了这是一个关于使用 JRuby 1.5.5 版本、OperaWatir 和 RSpec 进行自动化测试的项目或者资源集合。现在,我们将深入探讨这三个关键组件以及它们在 IT 领域中的应用。 JRuby...
结合JRuby和Rails,开发者可以在保留Rails优势的同时,利用Java平台的稳定性、性能和广泛的生态系统。通过JRuby on Rails,Java开发者可以使用Ruby的简洁语法和Rails的高效开发模式,同时享受Java的成熟技术栈和企业...
6. **最佳实践**:分享如何优化JRuby代码,提高性能,以及解决可能出现的问题和挑战。 7. **未来展望**:讨论JRuby的发展趋势,新版本特性,以及社区的活跃度和支持情况。 通过这份PPT,读者不仅可以了解JRuby的...
jruby安装包 和 jruby的lib库 JRuby是面向Ruby、基于Java虚拟机(JVM)的一种解释程序,它结合了Ruby语言的简易性和功能强大的JVM的执行机制,包括与Java库 全面集成。Rails彻底加快及简化了Web应用的开发,不过它让...
- **性能提升**:由于JVM的优化,JRuby在某些场景下比MRI(Ruby的原始C语言实现)有更高的性能。 - **企业级支持**:JRuby可以利用Java的成熟企业级服务,如数据库连接池、安全管理、集群等。 - **跨平台**:...
jruby-1.3.1.jar包 解决org.jruby.exceptions.JumpException 等报错
1. JRuby 是 Ruby 语言的 Java 实现,兼容 Ruby 1.8 和 1.9 版本,提供高性能和线程安全。 2. JRuby 可以与 Java 类库无缝集成,利用 Java 平台的强大功能,如 JMX、JDBC 和其他企业级框架。 3. JRuby 支持使用 ...
5. **案例研究**:可能会分享一些成功案例,展示JRuby如何在实际项目中帮助团队解决特定问题,或者实现传统Java无法轻易达成的目标。 6. **社区和资源**:介绍了JRuby的社区支持情况,包括文档、论坛、开源项目等,...
6. **案例研究**:提供实际的项目案例,展示如何在Java企业级环境中成功实施JRuby和Rails,解决可能遇到的问题和挑战。 7. **社区和工具**:列出相关的开源库、插件和工具,以及JRuby和Rails社区资源,帮助开发者...