• <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
            国产成人精品久久亚洲高清不卡 | 久久久中文字幕日本| 久久久精品国产| 久久无码高潮喷水| 国产精品女同久久久久电影院| av无码久久久久久不卡网站| 日韩精品国产自在久久现线拍| 久久精品国产亚洲5555| 色天使久久综合网天天| 女同久久| 久久精品国产亚洲av日韩| 国产精品久久久久乳精品爆| 久久久久久久久久久精品尤物 | 韩国免费A级毛片久久| 天天久久狠狠色综合| 久久精品aⅴ无码中文字字幕不卡 久久精品成人欧美大片 | 久久亚洲精品成人AV| 久久91亚洲人成电影网站| 欧美色综合久久久久久| 99久久99久久| 国内精品伊人久久久久777| 国产精品成人99久久久久 | 久久综合狠狠综合久久97色| 午夜天堂av天堂久久久| 久久久久亚洲AV无码专区网站 | 国产精品热久久无码av| 久久人爽人人爽人人片AV| 7777精品伊人久久久大香线蕉| 精品乱码久久久久久久| 亚洲色婷婷综合久久| 欧美亚洲国产精品久久| Xx性欧美肥妇精品久久久久久| 俺来也俺去啦久久综合网| 亚洲精品无码久久久久| 中文字幕无码久久久| 一本综合久久国产二区| 亚洲v国产v天堂a无码久久| 久久亚洲电影| 亚洲午夜久久久| 色妞色综合久久夜夜| 一个色综合久久|