设为首页 收藏本站
查看: 1059|回复: 0

[经验分享] C/Java/Python/Objective-C在OS X上的性能实验

[复制链接]

尚未签到

发表于 2015-4-20 09:35:16 | 显示全部楼层 |阅读模式
  前几天看到一篇介绍python的文章:如何让python变得更快——http://www.codeproject.com/Articles/522217/Howplustoplusmakepluspythonplusfaster,这篇文章勾起了我的好奇心,同样的算法多种编程语言在Mac的OS X上跑会是个什么情况呢?
  于是写了四种语言的斐波那契数列实现:C、Java、Python、Objective-C,而且都采用了效率最差耗时最长的递归实现,不使用其他数据结构或公式,这样对比起来更容易一些,如果使用迭代方式的话,执行时间太短很难比较。
  第一轮测试不做任何优化,第二轮分别做一些编译和环境的调优处理,然后再看一下结果。代码如下:

C语言,使用函数实现递归计算



#include
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
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(40) );
}
return 0;
}
基本的测试环境:
  C语言:i686-apple-darwin11-llvm-gcc-4.2
  Java:java version "1.6.0_37",HotSpot(TM) 64-Bit
  Python:Python 2.7.2 with GCC 4.2.1
  Pypy:PyPy 1.9.0 with GCC 4.2.1
  Objective-C:2.0 with LLVM 4.1
  
  使用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、数据量加大可能会有不同的结果,有兴趣的可以尝试下。



实验完成,希望对大家有参考。  

运维网声明 1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-58670-1-1.html 上篇帖子: Python 天天美味(37) 下篇帖子: Python 命令行解析工具 Argparse介绍(一)
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表