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


前幾天看到一篇介紹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 a3

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

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM