當前位置:首頁 > 芯聞號 > 充電吧
[導(dǎo)讀]其實我早就想寫這樣的文章了,但是,這個明顯會挑起語言之爭么。作為一個多年的版主,筆者實在是不想這么做的。于是乎,文章的名字從《為啥你的C/C++代碼和別人的Java/C#/python/Ruby一樣慢

其實我早就想寫這樣的文章了,但是,這個明顯會挑起語言之爭么。作為一個多年的版主,筆者實在是不想這么做的。于是乎,文章的名字從《為啥你的C/C++代碼和別人的Java/C#/python/Ruby一樣慢》改成了現(xiàn)在的。筆者日常工作主要使用C#,那寫代碼好爽啊,根本不用在乎程序的運行效率,因為怎么寫都很慢。各種內(nèi)存new了不用釋放的特性被一個一個的語言采用,就和一個到處拉屎的寵物狗一樣。最后你發(fā)現(xiàn),總需要人幫他鏟屎。 程序運行中需要各種各樣的資源,使用了都要歸還。而所謂的內(nèi)存管理,垃圾回收中的內(nèi)存只是其中的一種資源。其他的呢?文件你能不關(guān)么?socket你能不斷么?鎖你能不解么?這種半吊子的解決資源回收問題的方案,在筆者這種自詡完美主義者看來不是垃圾,就是拿出來騙人的!好了,牢騷發(fā)夠了,讓我們先看看激發(fā)我要寫這一系列文章的最后一根稻草。
?
公司拿回了被外包到印度的一個項目,C#代碼,我沒事看看的時候,發(fā)現(xiàn)這么一個函數(shù)(有修改)
?
 
        static string RandomString(int length)
        {
            Random random = new Random();
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string(Enumerable.Repeat(chars, length)
                .Select(s => s[random.Next(s.Length)]).ToArray());
        }
?


就是從某個字符集中隨機產(chǎn)生一個字符串,讓我們看看這堆狗屎到底做了什么。

首先字符集是 chars,然后要產(chǎn)生字符串結(jié)果的長度是length,這段代碼將字符集復(fù)制了length次,然后從每一個副本中隨機取一個組成一個列表,然后new 成一個字符串。各位吐了沒有?還好這個字符集,只有26+10個。要整一個Unicode的話,這段代碼直接要便秘了。 我直接想到的是有這么一種改進:
?
?
        static string MyRandomString1(int length)
        {
            Random random = new Random();
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            return new string(Enumerable.Range(0, length)
                .Select(i => chars[random.Next(chars.Length)]).ToArray());
        } 


至少,這段代碼不用復(fù)制字符集???

我直接把兩個函數(shù)調(diào)用1萬次,length=10000。然后一比。什么?居然耗時差不多?(此處我放一個書簽,也就是我們這篇文章的point)。

當時我認為,C# release 優(yōu)化的還不錯啊。于是乎寫下第二個 鄉(xiāng)民版

?
        static string MyRandomString2(int length)
        {
            Random random = new Random();
            const string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            StringBuilder sb = new StringBuilder(length);
            for (int i = 0; i < length; ++i)
            {
                sb.Append(chars[random.Next(chars.Length)]);
            }
            return sb.ToString();
        }

?
果然這段代碼在性能是輕松碾壓上兩個。Intel 公司長舒一口氣,果然 你是我的最好代言,要想使用語言新特性,請買酷睿最新第八代!
?
性能提升總是最誘人的,我下意識的想 如果用C++再寫一遍,這幫C#代碼要屁滾尿流到什么程度?
?
于是我就寫了寫,寫C++的時候慢了很多,因為我還在乎性能,不能像C#那個隨意拉隨意撒了
?
        string cppRandom(int length) {
            static string chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789";
            static auto random = bind(uniform_int_distribution(0, chars.length() - 1), default_random_engine());
            string res;
            res.resize(length);
            for (int i = 0; i < length; ++i) {
                res[i] = chars[random()];
            }
            return res;
        }


寫完后,滿心歡喜的運行,結(jié)果發(fā)現(xiàn) 只比前兩個linq版本 快不到四倍,比 鄉(xiāng)民版快不到兩倍。

才快一倍多,尼瑪我受打擊了,用不到linq,還要自己鏟屎,才給我快不到兩倍?。。?!

如果牛掰的人現(xiàn)在已經(jīng)知道原因了,這也是我前面留書簽的地方。我不賣乖了,原因就是,

。

。

。

。

。

。

。

。

。

。

。

。

這么多函數(shù)貌似測試的是隨機數(shù)產(chǎn)生器的性能!是不是 恍然大悟?是不是茅塞頓開?是不是有所回想?

這也就是本系列文章的引子,說起代碼快慢,比較的時候最好不要參雜其他因素,上面的例子引入了隨機數(shù)在測試函數(shù)里,就是問題。

于是乎,我就把幾萬(一萬個太小了)個隨機數(shù)先生成出來放在數(shù)組里,然后再測試,結(jié)果終于滿意了。
本文所有涉及代碼只貼片段,不提供完整代碼。你是碼農(nóng),不就是寫代碼的么?你應(yīng)該還要感謝我,所有代碼沒有上截圖。。。。
我從來不和別人爭辯哪個語言好,你說你哪個語言好,大不了我就用C/C++把你的編譯器,解釋器虛擬機寫出來,然后嵌入我的項目里(其實寫都不用寫,可能就是開源的,還是C/C++代碼),再寫寫你那個語言的代碼,反正寫著也很快(不用擔(dān)心鏟屎什么的)。
?
當然,在某些特定情況下解釋語言也很快,比如python的正則表達式解析匹配很快,幾乎可以匹敵C++。所以,我現(xiàn)在經(jīng)常把python嵌入到我的項目里,才幾兆~
?
?
?

本站聲明: 本文章由作者或相關(guān)機構(gòu)授權(quán)發(fā)布,目的在于傳遞更多信息,并不代表本站贊同其觀點,本站亦不保證或承諾內(nèi)容真實性等。需要轉(zhuǎn)載請聯(lián)系該專欄作者,如若文章內(nèi)容侵犯您的權(quán)益,請及時聯(lián)系本站刪除。
換一批
延伸閱讀

9月2日消息,不造車的華為或?qū)⒋呱龈蟮莫毥谦F公司,隨著阿維塔和賽力斯的入局,華為引望愈發(fā)顯得引人矚目。

關(guān)鍵字: 阿維塔 塞力斯 華為

加利福尼亞州圣克拉拉縣2024年8月30日 /美通社/ -- 數(shù)字化轉(zhuǎn)型技術(shù)解決方案公司Trianz今天宣布,該公司與Amazon Web Services (AWS)簽訂了...

關(guān)鍵字: AWS AN BSP 數(shù)字化

倫敦2024年8月29日 /美通社/ -- 英國汽車技術(shù)公司SODA.Auto推出其旗艦產(chǎn)品SODA V,這是全球首款涵蓋汽車工程師從創(chuàng)意到認證的所有需求的工具,可用于創(chuàng)建軟件定義汽車。 SODA V工具的開發(fā)耗時1.5...

關(guān)鍵字: 汽車 人工智能 智能驅(qū)動 BSP

北京2024年8月28日 /美通社/ -- 越來越多用戶希望企業(yè)業(yè)務(wù)能7×24不間斷運行,同時企業(yè)卻面臨越來越多業(yè)務(wù)中斷的風(fēng)險,如企業(yè)系統(tǒng)復(fù)雜性的增加,頻繁的功能更新和發(fā)布等。如何確保業(yè)務(wù)連續(xù)性,提升韌性,成...

關(guān)鍵字: 亞馬遜 解密 控制平面 BSP

8月30日消息,據(jù)媒體報道,騰訊和網(wǎng)易近期正在縮減他們對日本游戲市場的投資。

關(guān)鍵字: 騰訊 編碼器 CPU

8月28日消息,今天上午,2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會開幕式在貴陽舉行,華為董事、質(zhì)量流程IT總裁陶景文發(fā)表了演講。

關(guān)鍵字: 華為 12nm EDA 半導(dǎo)體

8月28日消息,在2024中國國際大數(shù)據(jù)產(chǎn)業(yè)博覽會上,華為常務(wù)董事、華為云CEO張平安發(fā)表演講稱,數(shù)字世界的話語權(quán)最終是由生態(tài)的繁榮決定的。

關(guān)鍵字: 華為 12nm 手機 衛(wèi)星通信

要點: 有效應(yīng)對環(huán)境變化,經(jīng)營業(yè)績穩(wěn)中有升 落實提質(zhì)增效舉措,毛利潤率延續(xù)升勢 戰(zhàn)略布局成效顯著,戰(zhàn)新業(yè)務(wù)引領(lǐng)增長 以科技創(chuàng)新為引領(lǐng),提升企業(yè)核心競爭力 堅持高質(zhì)量發(fā)展策略,塑強核心競爭優(yōu)勢...

關(guān)鍵字: 通信 BSP 電信運營商 數(shù)字經(jīng)濟

北京2024年8月27日 /美通社/ -- 8月21日,由中央廣播電視總臺與中國電影電視技術(shù)學(xué)會聯(lián)合牽頭組建的NVI技術(shù)創(chuàng)新聯(lián)盟在BIRTV2024超高清全產(chǎn)業(yè)鏈發(fā)展研討會上宣布正式成立。 活動現(xiàn)場 NVI技術(shù)創(chuàng)新聯(lián)...

關(guān)鍵字: VI 傳輸協(xié)議 音頻 BSP

北京2024年8月27日 /美通社/ -- 在8月23日舉辦的2024年長三角生態(tài)綠色一體化發(fā)展示范區(qū)聯(lián)合招商會上,軟通動力信息技術(shù)(集團)股份有限公司(以下簡稱"軟通動力")與長三角投資(上海)有限...

關(guān)鍵字: BSP 信息技術(shù)
關(guān)閉
關(guān)閉