C/Java/Python/ObjectiveC在OS X上的性能实验
C/Java/Python/Objective-C在OS X上的性能实验
2013-01-10 21:19 by 池建强, 1108 阅读, 6 评论, 收藏 , 编辑
前几天看到一篇介绍python的文章:如何让python变得更快——http://www.codeproject.com/Articles/522217/Howplustoplusmakepluspythonplusfaster,这篇文章勾起了我的好奇心,同样的算法多种编程语言在Mac的OS X上跑会是个什么情况呢?
于是写了四种语言的斐波那契数列实现:C、Java、Python、Objective-C,而且都采用了效率最差耗时最长的递归实现,不使用其他数据结构或公式,这样对比起来更容易一些,如果使用迭代方式的话,执行时间太短很难比较。
第一轮测试不做任何优化,第二轮分别做一些编译和环境的调优处理,然后再看一下结果。代码如下:
C语言,使用函数实现递归计算
#include <stdio.h> long fib( int n){ if (n < 2 ) return n; return fib(n - 1 ) + fib(n - 2 ); } int main() { printf( " fib= %ld " , fib( 40 ) ); return 0 ; }
Java,使用静态方法实现递归计算
public class fib { public static long jfib( int n ){ if (n < 2 ) return n; return jfib(n - 1) + jfib(n - 2 ); } public static void main(String[] args) { System.out.println( jfib( 40 ) ); } }
Python,使用函数实现递归计算
def fib(n): if n < 2 : return n return fib(n - 1) + fib(n - 2 ) print fib(40)
Objective-C,使用block实现递归计算
#import <Foundation/Foundation.h> int main( int argc, const char * argv[]) { @autoreleasepool { long (^__block fib)( long ) = ^( long num){ if ( num < 2 ) return num; return fib(num- 1 ) + fib(num- 2 ); }; NSLog( @" Fib: %ld " , fib(4 0 ) ); } return 0 ; }
基本的测试环境:
Java:java version "1.6.0_37",HotSpot(TM) 64-Bit
使用time命令计算执行时间,例如time python fib.py
直接编译运行的结果还是比较让人吃惊的:
C:1 秒
Java:0.63 秒
Python:45.79 秒
Objective-C:1.3 秒
结果:Java > C > Objective-C > Python
这个结果让人感到,Java真的不慢,动态语言有点慢。
第二轮测试,针对C程序,使用gcc -O进行优化编译;针对Python,使用pypy替换原生的python环境,针对Objective-C,设置优化Level为Fastest,结果如下:
C:0.35 秒
Java:0.63 秒
Python:4.96 秒
Objective-C:1.04 秒
结果:C > Java > Objective-C > Python
这个结果告诉我们,C还是最快的,pypy对python的优化处理还是非常明显的。
以上数据是在OS X平台上的、性能比例放大的测试结果,在实际应用中,如果针对不同场景采用了正确的算法,差距就不会有这么大,比如我们用迭代方式改写一下python的实现,如下:
def fib(n): if n < 2 : return n a1 = a2 = a3 = 1 while n>2 : n -= 1 a3 =a1+ a2 a1 = a2 a2 = a3 return a3 print fib(40)
这时无论使用Python编译执行还是Pypy执行,基本都是0.02秒左右,没有太大差别。以上代码的执行结果是102334155,有兴趣的可以在自己的机器上试试。
声明:
1、以上代码仅供参考娱乐,实际应用中如果使用斐波那契数列,绝对不要使用递归调用的方式,迭代法应该是不错的选择。
2、数据量加大可能会有不同的结果,有兴趣的可以尝试下。
实验完成,希望对大家有参考。
身边越来越多的人开始使用Mac,经常被问道Mac的使用问题和技术问题。遂决定,每天发布一则#Mac技巧#。同时发布于微博和微信公众账号“Mac技巧”,微信号sagacity-mac,有微信账号的童鞋扫描下图片或搜索微信号即可
分类: Apple , Python
标签: python , objective-c , java
作者: Leo_wl
出处: http://www.cnblogs.com/Leo_wl/
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
版权信息查看更多关于C/Java/Python/ObjectiveC在OS X上的性能实验的详细内容...