日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

dotnet程序优化心得(三)

發布時間:2025/3/8 编程问答 23 豆豆
生活随笔 收集整理的這篇文章主要介紹了 dotnet程序优化心得(三) 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

(4)繼續優化――用空間換取時間

現在對每一個字符,都要用get_Item(object key)方法過一遍,可這個乖乖方法那么長,肯定太耗時間了,能不能用更簡單的手段呢?改Hashtable?哇,那代碼,叫一個看不懂。仔細琢磨琢磨,有了,直接用數組!每一個漢字對應一個Int16,以該值為索引,數組中在那個位置的值為值,這樣最快速了。就是占點空間,內存便宜嘛。反正這東西只初始化一次,占不了多少k。新程序如下:

?1public?class?QuickChineseConvert
?2{
?3????static?char[]?_lib;
?4????static?int?_size;
?5
?6????static?QuickChineseConvert()
?7????{
?8????????_size=UInt16.MaxValue;
?9????????Init();
10????}

11????static?string?GB_lib="……";
12????static?string?BIG5_lib="……";
13
14????private?static?void?PushIntoArray(char[]?c?,?string?g,?string?b)
15????{
16????????for?(int?i=0;i<g.Length;i++)
17????????{
18????????????c[Convert.ToUInt16(g[i])]=b[i];
19????????}

20????}

21
22????private?static?void?Init()
23????{
24????????_lib?=?new?char[_size];
25????????PushIntoArray(_lib,GB_lib,BIG5_lib);
26????}

27
28????public?static?char?ToBIG5(char?inputChar)
29????{
30????????char?temp?=?_lib[Convert.ToUInt16(inputChar)];
31????????return?temp==0?inputChar:(char)temp;
32????}

33
34????public?static?string?ToBIG5(string?inputString)
35????{
36????????StringBuilder?sb?=?new?StringBuilder();
37????????for?(int?i=0;i<inputString.Length;i++)
38????????{
39????????????sb.Append(ToBIG5(inputString[i]));
40????????}

41????????return?sb.ToString();
42????}

43}


這樣的話,對于每一個字符,只進行幾個簡單的操作了:

Convert.ToUInt16(inputChar)
從數組中取值_lib[Convert.ToUInt16(inputChar)]
然后就是return temp==0?inputChar:(char)temp;

對比Hashtable臭長臭長的get_Item(object key),這下簡單多了!當然,要付出一定代價,代價就是要弄一個大小為UInt16.MaxValue的數組,不大嘛。

測試性能,很鼓舞人心:1857萬字/s


(5)Go on...........

還能繼續優化嗎?數組不是還要檢查邊界條件嗎?用指針?書上說能提高性能17%。17%少了點,不過也試一試。測試結果表明,性能沒怎么提高。現在性能瓶頸在傳值,return那一塊,用ref,out什么的試一試?
做了以下類似的改動,這個性能又提了到差不多10倍。

1????????????????public?static?void?ToBIG5(ref?char?inputChar)
2????????????????{
3????????????????????????char?temp?=?LibGB2BIG5[Convert.ToUInt16(inputChar)];
4????????????????????????if?(temp!=0)?inputChar=temp;
5????????????????}

1????????????????public?static?void?ToBIG5(ref?char[]?inputString)
2????????????????{
3????????????????????????for?(int?i=0;i<inputString.Length;i++)
4????????????????????????{
5????????????????????????????????inputString[i]=ToBIG5(inputString[i]);
6????????????????????????}

7????????????????}


測試結果:1.444億字/s。10個指令周期一個字符!!應該不能再優化了吧!到此為止吧,這性能應該夠用了.

不過這個結果有點偽,因為必須傳入字符或字符數組。而String是只讀的,使用過程必須復制一遍,用String做參數性能只到的了8000萬字/s左右

(6)優化路徑小結

??????????? 簡單的方法,Replace,30萬字/s?
------->采用更好的數據結構和算法(Hashtable),300萬字/s
------->用reflector查看Hashtable代碼,做進一步的優化,500萬字/s
------->分析問題所在,直接采用數組,用空間換取時間,1850萬字/s
------->采用ref,out等技巧做進一步優化,1.44億字/s(傳數組)8000萬字/s(傳string)

?

總結

以上是生活随笔為你收集整理的dotnet程序优化心得(三)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。