C/Java/Python/Objective-C在OS X上的效能實驗

來源:互聯網
上載者:User

前幾天看到一篇介紹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(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 a3print fib(40)
 這時無論使用Python編譯執行還是Pypy執行,基本都是0.02秒左右,沒有太大差別。以上代碼的執行結果是102334155,有興趣的可以在自己的機器上試試。聲明:1、以上代碼僅供參考娛樂,實際應用中如果使用斐波那契數列,絕對不要使用遞迴調用的方式,迭代法應該是不錯的選擇。2、資料量加大可能會有不同的結果,有興趣的可以嘗試下。 實驗完成,希望對大家有參考。

 

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.