• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>

            qiezi的學習園地

            AS/C/C++/D/Java/JS/Python/Ruby

              C++博客 :: 首頁 :: 新隨筆 ::  ::  :: 管理 ::
            實際上不是全面測試性能。應該這么說:使用一個你熟悉的語言,用它寫出一個高效的版本(做下面那件事)。

            不小心讀到一個帖子:http://blog.vckbase.com/jzhang/archive/2006/03/28/18807.html

            看到C++竟然被比下去了,自然不是很舒服,畢竟C++對于C并沒有太大的性能上的降低,而python是C寫的(指Cpython實現),自然不會高過C。(廢話,C基本上接近匯編效率了)

            可惜C++又很難找出這么高效的實現,STL效率還是低了些(為什么?一直以為它很高效,用得比較放心)。最近一直比較關注D語言,于是用D語言來測試一下。代碼如下:

            ?1?import?std.stdio;
            ?2?import?std.string;
            ?3?import?std.perf;
            ?4?
            ?5?int?main(char[][]?argv)
            ?6?{
            ?7???if?(argv.length?<?3)?{
            ?8?????writefln("Wrong?arguments");
            ?9?????return?1;
            10???}
            11?
            12???const?int?READ_SIZE?=?1024;
            13?
            14???FILE*?fin?=?fopen(argv[1],?"r");
            15???FILE*?fout?=?fopen(argv[2],?"w");
            16???char?buffer[READ_SIZE];
            17???int[char[]]?emails;
            18?
            19???PerformanceCounter?counter?=?new?PerformanceCounter();
            20???counter.start();
            21???while?(!feof(fin)){
            22?????fgets(cast(char*)buffer,?READ_SIZE,?fin);
            23?????char[]?email?=?toString(cast(char*)buffer);
            24?????if?(!(email?in?emails)){
            25???????emails[toString(buffer)]?=?0;
            26???????fputs(cast(char*)email,?fout);
            27?????}
            28???}
            29?
            30???fclose(fout);
            31???fclose(fin);
            32???counter.stop();
            33?
            34???writefln(counter.milliseconds());
            35???return?0;
            36?}
            37?

            沒加fopen失敗處理。

            測試結果在我的機器上耗時只有python版本的1/3,我看到其它網友的C++實現最好成績也不過1/2,由于是D是C語言所寫,測試使用的又是C庫,自然可以認為C語言還是比較高效的。

            上面的D語言代碼里調用了toString,把char*轉為char[],它的源代碼如下:
            char[]?toString(char?*s)
            {
            ????
            return?s???s[0?..?strlen(s)]?:?cast(char[])null;
            }

            如果s[0 .. strlen(s)]產生了復制的話,應該是會影響性能的。char[]對象是受GC管理的,應該會復制一份。這種情況下還能有如此高的效率,的確很不錯。

            不過python的性能讓我感覺很吃驚,以前只測試過字符串連接,感覺比較高效。

            寫了一個完成一樣功能的ruby程序,耗時接近python版本的2倍,當然由于對它不是很熟,可能寫得不夠高效。
            ?1?emails?=?Hash.new
            ?2?
            ?3?start?=?Time.now
            ?4?fout?=?open('email-2-new1.txt',?'w')
            ?5?open('email-2.txt').each?do?|line|
            ?6???if?!emails.has_key??line
            ?7?????emails[line]?=?0
            ?8?????fout?<<?line
            ?9???end
            10?end
            11?puts?Time.now?-?start
            12?

            正如某網友所說,這個程序的瓶頸在于IO,拿來作性能上的比較或許是不合適的。從語言效率上來講,自然是C++和D相當,可能會比D高,python應該會低很多。但在很多情況下,衡量效率不光是語言本身,還有庫,沒有庫的語言是沒什么吸引力的。python是一種很“慢”的語言,相對C/C++來說,不過它是一門實用性的語言,所以它為一些特定用法做了優化,取得了不錯的成績。C++是一門通用語言,或許太注重語言的性能了,忽略了庫,導致庫把性能給拉下來了。這種情況下,有人評測java和C++的性能,結果是java要高,自然是不那么讓人驚奇的了。可是如果標準庫都這么慢,那還能指望什么呢?

            當然也并沒有證明STL就特別慢,也可能是使用不正確。


            只是剛好看到這個比較,忍不住參與一下,切勿當真。
            posted on 2006-03-31 11:06 qiezi 閱讀(830) 評論(0)  編輯 收藏 引用 所屬分類: 雜談D
            亚洲七七久久精品中文国产| 久久99中文字幕久久| 国产精品久久婷婷六月丁香| 香蕉久久夜色精品国产2020| 一本色道久久综合狠狠躁| 91精品国产乱码久久久久久 | 国产精品99久久精品| 久久精品国产精品亚洲艾草网美妙 | 久久强奷乱码老熟女网站| 亚洲中文久久精品无码| 国产亚洲精午夜久久久久久| 77777亚洲午夜久久多人| 久久精品无码一区二区app| 久久久免费精品re6| 99久久免费国产精品特黄| 欧美精品一区二区精品久久| 久久精品人妻中文系列| 久久久精品久久久久久 | 久久精品国产第一区二区| 国产人久久人人人人爽| 久久99热这里只频精品6| 国产免费久久精品丫丫| 精品久久久久久亚洲| 色综合久久中文字幕无码| 婷婷国产天堂久久综合五月| 久久国产精品二国产精品| 久久国产精品一区二区| 亚洲国产精品成人久久| 久久精品国产99国产精品导航| 国产精品欧美久久久久无广告| 99久久精品费精品国产一区二区| 国内精品综合久久久40p| 97视频久久久| 久久国产免费直播| 综合人妻久久一区二区精品| 久久国产精品无| 久久大香萑太香蕉av| 精品国产乱码久久久久久人妻| 欧美性猛交xxxx免费看久久久| 久久精品一区二区三区中文字幕| 成人精品一区二区久久久|