阅读更多

14顶
1踩

编程语言
这个星期我使用charlie(一个遗传算法库)和重写的TSP范例来测试Ruby1.8, Ruby 1.9, JRuby和Rubinius(Ruby虚拟机)。测试结果让人吃惊,数据如下:

Ruby 1.8 (MRI):
$ time ruby tsp_solver.rb
real 0m34.940s
user 0m34.398s
sys 0m0.125s

Ruby 1.9 :
$ time ruby19 tsp_solver.rb
real 0m21.533s
user 0m20.736s
sys 0m0.119s

Let's move to the alternatives now.

First JRuby 1.1:
$ time jruby tsp_solver.rb
real 0m57.815s
user 0m48.651s
sys 0m0.751s

JRuby 1.1 with -J-server flag:
$ time jruby -J-server tsp_solver.rb
real 0m34.834s
user 0m37.714s
sys 0m0.667s

And finally Rubinius:
$ time rbx tsp_solver.rb
real 12m29.830s
user 12m20.105s
sys 0m4.219s

我本来以为Ruby 1.8会很慢,没想到Ruby 1.8速度仅次于Ruby 1.9,而Rubinius的速度是最慢的,考虑到它是一个虚拟机,而且这是一个很新的项目,这意味着未来还有很大的成长空间。

我使用的机器是:MacBook Pro with 2.2GHz Intel Core 2 Duo and 2GB Ram running Mac OS X Leopard 10.5.2。测试代码tsp_solver.rb,需要安装charlie gem。不用把这次测试当作正式的性能选择依据,可以大概了解一下ruby不同版本的运行速度。

下面是RVMs versions:

    * $ ruby -v
      ruby 1.8.6 (2007-09-24 patchlevel 111) [universal-darwin9.0]

    * rbx -v
      rubinius 0.8.0 (ruby 1.8.6 compatible) (bbe450f22) (04/15/2008) [i686-apple-darwin9.2.2]

    * $ ruby19 -v
      ruby 1.9.0 (2007-12-25 revision 14709) [i686-darwin9.2.2]

    * $ jruby -v
      ruby 1.8.6 (2008-03-28 rev 6360) [i386-jruby1.1]
      And: $ java -version
      java version "1.5.0_13"
      Java(TM) 2 Runtime Environment, Standard Edition (build 1.5.0_13-b05-237)
      Java HotSpot(TM) Client VM (build 1.5.0_13-119, mixed mode, sharing)
14
1
评论 共 5 条 请登录后发表评论
5 楼 withyou 2008-04-28 09:12
jruby的速度比想象中的快
4 楼 dennis_zane 2008-04-28 09:07
jruby的表现不出意料,不过内存肯定要大上许多,估计在2到3倍
3 楼 caoyi1983 2008-04-27 11:27
直接用java呢?
2 楼 caoyi1983 2008-04-27 11:26
如果用python和jython又会怎么样呢?
1 楼 caoyi1983 2008-04-27 11:23
唉,为了说句话又登录了一次。
JRuby 1.1 with -J-server flag 意思是运行时添加 -server 参数么?我们都知道java运行的效率主要看虚拟机,如果使用1.6版本的虚拟机怎么样呢?bea和ibm的怎么样呢?

发表评论

您还没有登录,请您登录后再发表评论

相关推荐

  • 探讨operator new和new operator

    探讨operator new和new operator

  • 解析C++中的new、operator new、operator new[]和delete、operator delete、operator delete[](下)

    注:以下测试均在VS2015下进行,其他编译器可能会有轻微差别。 继续整理第二部分的内容。 二、operator new/delete,以及其对应的数组版本new[]/delete[]。 operator new优先调用全局重载的,所以::operator new(sizeof(COperatorTest))和operator new(sizeof(COper

  • C++ 内存分配(new,operator new)详解

    讲述C++ new关键字和operator new, placement new之间的种种关联,new的底层实现,以及operator new的重载和一些在内存池,STL中的应用。

  • C++的三种new简介及重载局部(类内部)与全局operator new

    先简单解释下C++的三种new,由于它们的名字实在是。。我就说的通俗点。1、new运算符(new operator)大哥,我们在代码中直接使用的就是它。它做2件事:调用后两种new申请内存和初始化对象。2、operator new,是一个函数,所以也是三种new唯一一个可以重载的。它类似C语言中的malloc,用于分配内存。3、placement new,用于初始化对象(如果有的话,就是它调用构造...

  • 深入C++的new

    “new”是C++的一个关键字,同时也是操作符。关于new的话题非常多,因为它确实比较复杂,也非常神秘,下面我将把我了解到的与new有关的内容做一个总结。new的过程当我们使用关键字new在堆上动态创建一个对象时,它实际上做了三件事:获得一块内存空间、调用构造函数、返回正确的指针。当然,如果我们创建的是简单类型的变量,那么第二步会被省略。假如我们定义了如下一个类A:class A{  

  • 【C++语法】new和malloc的区别

    属性 new和delete是C++中独有的操作符,需要编译器支持;而malloc和free是C/C++中的标准库函数,需要头文件支持。 参数 使用new操作符申请内存分配时无须指定内存块的大小,编译器会根据类型信息自行计算。 而malloc则需要显式地指出所需内存的尺寸。 返回类型 new操作符内存分配成功时,返回的是对象类型的指针,类型严格与对象匹配,无须进行类型转换,故new是符合类型安全性的操作符。 而malloc内存分配成功则是返回void * (可强制转换为任何类型),需要通过强制类型转换将voi

  • c++11 function源码分析

    以VS2019 function源码为例分析。 class function: template <class _Fty> class function : public _Get_function_impl<_Fty>::type { // wrapper for callable objects private: using _Mybase = typename _Get_function_impl<_Fty>::type; public: func

  • 在一个模块中分配的内存在另外一个模块释放?

    在linux下跑得一直很好的程序,到了windows下面就跑不起来了。内存异常,检查了一下,很快发现是因为在主程序中释放了一块在DLL中分配的内存,这种问题虽然早就知道了,但是一直没有仔细考虑过,所以今天就深入研究了一下。 在linux下,每个进程只有一个heap,在任何一个动态库模块so中通过new或者malloc来分配内存的时候都是从这个唯一的heap中分配的,那么自然你在其它随便什么地

  • C++operator重载问题

    operator是C++的关键字,它和运算符一起使用,表示一个运算符函数,理解时应将operator=整体上视为一个函数名。    这是C++扩展运算符功能的方法,虽然样子古怪,但也可以理解:一方面要使运算符的使用方法与其原来一致,另一方面扩展其功能只能通过函数的方式(c++中,“功能”都是由函数实现的)。    一、为什么使用操作符重载? 对于系统的所有操作符,一般情况下,只

  • 如何实现自己特定的内存管理,如何正确替换C++中的全局运算符new和delete

    如何实现自己特定的内存管理,如何正确替换C++中的全局运算符new和delete

  • Cpp--重载全局的new和delete

    #include #include #include #include #define MAX_SIZE 30000 char MemArr[MAX_SIZE]; char *pMem=MemArr; void *operator new(unsigned bytes){ printf("myGlobal-operator-new!bytes=%d\n",bytes); if(pMem+by

  • C/C++ 替换编译器CXX内存分配释放的实现(new & delete)

      C/C++ 的 new 调用 “::operator new” 函数进行内存分配,delete 调用 “::operator delete” 函数,但我们现在要做的是在不影响应用代码前提下替换其 “C/C++” 内存的分配与释放。   我们先琢磨大概有哪些实现,很多人们可能会考虑到通过 “inline-hook”,这是可行的,只需要拿到这几个由编译器内置的 “new、delete” 的函数地...

  • tcmalloc为什么快,如何替换系统malloc

    使用了thread cache,小块的内存分配都可以从cache中分配。多线程分配内存的情况下,可以减少锁竞争。 tcmalloc官方文档见: https://gperftools.github.io/gperftools/tcmalloc.html tcmalloc可以替换大多数系统、不同编译器环境下的内存分配函数(malloc/free/new/delete),针对不同的编译器和操作系统,...

  • 浅谈C++跨模块释放内存

    浅谈C++跨模块释放内存一, MT改MD二, DLL提供释放接口三, 使用进程堆申请内存      在开发主程序和动态库时,首要原则就是:避免跨模块申请和释放内存。这一点,我们在很多开源库或者平常项目中也都碰到过,对于动态库中的堆内存申请与释放,动态库总是会提供两个接口分别实现new和delete操作,而不会让调用方自己去操作。但有时候如果违背了这个原则呢,在linux平台上不会存在这样的忧虑,因为在linux下,每个进程只有一个heap,在任何一个动态库模

  • 什么情况下要替换C++自带的new和delete

    c++ - Why would one replace default new and delete operators? - Stack Overflow用来检测用户错误,比如(1)new的时候可以记录所有new出来的地址,然后用户忘记delete时帮用户delete(2)new出地址时前后放一些记号,防止overrun和underrun用来提高效率用来收集统计数据,比如(1)地址分布,生存期分...

  • Kingofark的人工智能启示录

    K ][ N G of A R K ™s The Revelation Of AIK ][ N G of A R K ™的人工智能启示录Whats It Mean to Be Human, Anyway?"人性化"究竟意味着什么?Revision 0.1by  Charles Platt  K ][ N G of A R K ™  译

  • Guru of the Week 条款20:代码的复杂性(第一部分)

    GotW #20 Code Complexity – Part I著者:Herb Sutter翻译:K ][ N G of @rk™[声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者kingofark在未经原著者本人同意的情况下翻译本文。本翻译内容仅供自学和参考用,请所有阅读过本文的人不要擅自转载、传播本翻译内容;下

  • Guru of the Week 条款17:转型

    GotW #17 Casts著者:Herb Sutter翻译:K ][ N G of @rk™[声明]:本文内容取自www.gotw.ca网站上的Guru of the Week栏目,其著作权归原著者本人所有。译者kingofark在未经原著者本人同意的情况下翻译本文。本翻译内容仅供自学和参考用,请所有阅读过本文的人不要擅自转载、传播本翻译内容;下载本翻译内容的人请在阅读浏览后,立即删

Global site tag (gtag.js) - Google Analytics