• <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>
    • 軟件測試技術
    • 軟件測試博客
    • 軟件測試視頻
    • 開源軟件測試技術
    • 軟件測試論壇
    • 軟件測試沙龍
    • 軟件測試資料下載
    • 軟件測試雜志
    • 軟件測試人才招聘
      暫時沒有公告

    字號: | 推薦給好友 上一篇 | 下一篇

    三大編程語言性能PK:Java, C/C++和Ruby

    發布: 2007-4-26 23:57 | 作者: seanhe | 來源: | 查看: 137次 | 進入軟件測試論壇討論

    領測軟件測試網   你可能會覺得下面的圖表比較有意思,因為它是分別用三種編程語言(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.kjueaiud.com/


    關于領測軟件測試網 | 領測軟件測試網合作伙伴 | 廣告服務 | 投稿指南 | 聯系我們 | 網站地圖 | 友情鏈接
    版權所有(C) 2003-2010 TestAge(領測軟件測試網)|領測國際科技(北京)有限公司|軟件測試工程師培訓網 All Rights Reserved
    北京市海淀區中關村南大街9號北京理工科技大廈1402室 京ICP備2023014753號-2
    技術支持和業務聯系:info@testage.com.cn 電話:010-51297073

    軟件測試 | 領測國際ISTQBISTQB官網TMMiTMMi認證國際軟件測試工程師認證領測軟件測試網

    老湿亚洲永久精品ww47香蕉图片_日韩欧美中文字幕北美法律_国产AV永久无码天堂影院_久久婷婷综合色丁香五月

  • <ruby id="5koa6"></ruby>
    <ruby id="5koa6"><option id="5koa6"><thead id="5koa6"></thead></option></ruby>

    <progress id="5koa6"></progress>

  • <strong id="5koa6"></strong>