前幾天看到一篇介紹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、資料量加大可能會有不同的結果,有興趣的可以嘗試下。 實驗完成,希望對大家有參考。