你可能會覺得下面的圖表比較有意思,因為它是分別用三種編程語言(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年的編輯。
Trackback: http://tb.blog.csdn.net/TrackBack.aspx?PostId=1143161
馬嘉楠
jianan.ma@gmail.com
posted on 2006-09-04 09:40
馬嘉楠 閱讀(347)
評論(0) 編輯 收藏