本文不講c#開發技巧,隻測試同樣的代碼在不同cpu的機器上的運作速度。結果包括普通版本和并行版本的對比,友善大家選配電腦,對“性能”有個感性的認識。
字元串相關度計算是文本處理和資料挖掘中一個不可或缺的方法,例如論文查重等。levenshtein distance可以用來比較兩個字元串的相似度,即兩個字元串之間的“距離”。這個“距離”其實就是從源字元串變換到目标字元串需要進行的删除、插入和替換的次數。
有不少該算法的改進版本,可大幅度提升效率,不過這不是本文的目的。我們的目的就是看看該算法在不同的機器下到底能跑多快,再看并行優化後又能跑多快。該算法基本隻對cpu性能敏感,很适合做測試。
我們随機生成1000個1000長度的字元串,并比較字元串相關度。示例工程可在文末找到,由于需要并行計算,需要vs2010,.net4.0支援。
代碼如下:
廢話不說,上測試結果。
以上四種環境對應不同開發階段的軟體性能,對開發的性能調優有指導價值。
電腦組態如下:
測試結果如下,數值為執行時間,機關為ms
值得注意的是,在不同代碼下四種環境的結果是很不相同的。一般情況下軟體直接運作要比調試快很多。release模式比debug模式快幾倍。但在這個示例下,直接運作和調試卻沒有特别明顯的差別,希望大神能給予解答。
另外,并行算法比普通的串行算法快了四倍。符合四核cpu的實際情況。
接下來,我們來看不同cpu下的性能差別。為簡化測試,以下所有結果都采用release運作模式。對比不同cpu在串行/并行下的速度差別。
結果都是以執行時間ms表示的,值越小越好。
難得找到amd的筆記本電腦,該cpu已經停産很久了,三年前的cpu不負衆望,成績還不錯,當然并行成績比伺服器慢了十幾倍。
雖然比t8100的頻率低,但新一代酷睿i3還是完虐t8100的。
回想06年底,能買到酷睿e6300是剛上高三的我最大的夢想,現在看來是在不敢恭維,并行速度和i7比差了四倍不止。這款當時很牛的桌面cpu連現在低端的筆記本cpu都不如。
超級本的性能還是不錯的,也展現出了雙核的優勢。在“節能模式”下,cpu不會自動睿頻,隻有1.7ghz。結果慘不忍睹。超級本一般情況下做開發足夠了。
不得不說,标壓筆記本的i5都可以完虐超低壓的i7. 誰讓超級本必須做到那麼薄呢? 價格還死貴。如果考慮性能和成本效益,還是選标壓cpu吧。
雖然是i3,但在串行下與同頻的i7幾乎無差別,當然由于是雙核的,并行速度正好是串行的一半。
實在沒有找到2600k的超頻結果,就先用2600默頻湊數吧,單核性能中規中矩。
寝室桌上型電腦的跑分,看來頻率是王道啊,在4.2g輕松秒殺i7 2600。
伺服器六核心cpu看似高端,但在這個程式下,還是無法與2600甚至2130抗衡,并行加速比4.66, 六核心有點小吃虧。
這幾乎是我目前看到的最好結果, 該cpu在串行模式下就達到了11.657s的水準,并行加速比達到了可喜的7.32。可是與2500k這樣的cpu不對等的是它的售價,一萬三四夠買10個2500k了。
下圖是不同cpu串行速度的對比圖:
我們看到基本上同平台,同架構的cpu間,頻率是王道。而目前i3新酷睿都可以幹掉當年桌面的老酷睿經典,不得不說技術發展迅速。而伺服器核心雖然核心多,甚至是雙cpu,但頻率一般,是以在這種普通應用下甚至抗不過桌面的i5 2500k。 能多核優化的程式還是占少數,大家能超就超一點吧,超頻帶來的性能提升真心不是一點點。
下圖是并行下速度對比圖:
并行計算下,核的數量是王道!在非伺服器核心上,加速比幾乎就是cpu核心數。四核的速度就是比雙核的快。在八核的頂級伺服器cpu上,它的速度幾乎是amd ql-62的13倍!但若算是這台機器有雙cpu16個核心的話,加速比和16還是差很多的。難道.net并行庫對多cpu支援不好?我怎麼記得它可以支援最多64個cpu?
咱不是專業的硬體測評師,隻是好奇之下跑了幾個分數看了他們的性能而已,花了整整一晚上時間,是以若有不足之處還請海涵。
總體來說,單核性能頻率和架構決定一切,多核性能上核心數決定了加速比。 桌面級應用完全沒必要買伺服器的多核心(e3 1230這類除外)。大部分程式最多隻對四核cpu做過優化。更多核心甚至雙cpu會造成各種不相容性問題,連遊戲都打不了(嘿嘿),程式設計都卡。
現在覺得,i5 2500k還是要比e3 1230成本效益高很多,超頻超出來的性能不是蓋的。别擔心壽命,它隻會在需要的時候睿頻到更高的頻率,平時都是乖乖的二點幾吉赫茲。而且非常簡單!enjoy it!
程式并行的優勢還是非常明顯的,.net的并行庫可比intel并行庫友善多了(雖然效率不能比),但它可以很好的幫助你挖掘多核cpu的潛力。大家可以多學習一下.net并行庫。