你可能會覺得下面的圖表比較有意思,因爲它是分別用三種編程語言(Ruby, Java, C/C++)寫的埃拉托色尼質數過濾算法(譯註:Sieve of Eratosthenes)的性能分析圖,如圖:(本文的最後附有相應代碼)
好,很明顯Ruby是慢的,而且慢了大概有1.5個數量級(譯註:即約30倍)。這對於Ruby愛好者來說可不是個好消息。不過換個角度看,呼!Ruby與五、六年前的頂級電腦一樣快。還記得第一次在時鐘週期不到一兆赫的機器上跑程序的神奇情景嗎...我們還爲此興奮得直往山頂跑!
注意一下,這三條曲線是同樣形狀的,我們可以從上篇 blog 中瞭解到爲何曲線會呈線性。最後要關注的是,Java的曲線以極其微小的優勢快於C++。你可以抱怨那是因爲沒有用gcc編譯器優化編譯的緣故(我用的是cygwin(譯註:gcc編譯器移植到windows的版本)),可是,如果現在還有任何C++程序員還會嘲笑Java的性能的話,我勸你最好還是再重新掂量掂量吧。
而對於那些因爲他們自己的開發環境比Ruby快上30倍而洋洋自得的Java程序員來說,我肯定更優的ruby實時編譯器即將問世了。不管如何,相比那快上1.5個數量級的情形來說,我本人還是更喜歡乾淨、簡潔、易維護的代碼。
Ruby
require 'benchmark'
def sievePerformance(n)
r = Benchmark.realtime() do
sieve = Array.new(n,true)
sieve[0..1] = [false,false]
2.upto(Integer(Math.sqrt(n)) do |i|
if sieve[i]
(2*i).step(n,i) do |j|
sieve[j] = false
end
end
end
end
r
end
Java
public class GeneratePrimes {
public static double generate(int max) {
long start = System.currentTimeMillis();
boolean sieve[] = new boolean[max];
Arrays.fill(sieve, true);
sieve[0] = false;
sieve[1] = false;
for (int i = 2; i < Math.sqrt(max); i++) {
if (sieve[i]) {
for (int j = 2*i; j < sieve.length; j+=i) {
sieve[j]= false;
}
}
}
return (System.currentTimeMillis() - start)/1000.0;
}
C++
#include <iostream>>
#include <math.h>
#include <sys/time.h>
using namespace std;
double generate(int max) {
struct timeval start;
struct timezone tz;
gettimeofday(&start, &tz);
bool *sieve = new bool[max];
for (int i=0; i<max; i++) sieve[i] = true;
sieve[0] = false;
sieve[1] = false;
for (int n=2; n<sqrt(max); n++) {
if (sieve[n]) {
for (int j=2*n; j<max; j+=n)
sieve[j] = false;
}
}
struct timeval end;
gettimeofday(&end, &tz);
double startSecond = start.tv_usec/1000000.0;
double endSecond = (end.tv_sec - start.tv_sec) + end.tv_usec/1000000.0;
return endSecond - startSecond;
}
int main(int ac, char** av) {
for (int i=100000; i<=5000000; i+=100000) {
double time = generate(i);
cout << time << endl;
}
}
(原文鏈接網址:http://www.butunclebob.com/ArticleS.UncleBob.SpeedOfJavaCppRuby; Robert C. Martin的英文blog網址: http://www.butunclebob.com/ArticleS.UncleBob)
作者簡介: Robert C. Martin 是Object Mentor公司總裁,面向對象設計、模式、UML、敏捷方法學和極限編程領域內的資深顧問。他不僅是Jolt獲獎圖書《敏捷軟件開發:原則、模式與實踐》(中文版)(《敏捷軟件開發》(英文影印版))的作者,還是暢銷書Designing Object-Oriented C++ Applications Using the Booch Method的作者。Martin是Pattern Languages of Program Design 3和More C++ Gems的主編,並與James Newkirk合著了XP in Practice。他是國際程序員大會上著名的發言人,並在C++ Report雜誌擔任過4年的編輯。