dotnet程序优化心得(三)
(4)继续优化――用空间换取时间
现在对每一个字符,都要用get_Item(object key)方法过一遍,可这个乖乖方法那么长,肯定太耗时间了,能不能用更简单的手段呢?改Hashtable?哇,那代码,叫一个看不懂。仔细琢磨琢磨,有了,直接用数组!每一个汉字对应一个Int16,以该值为索引,数组中在那个位置的值为值,这样最快速了。就是占点空间,内存便宜嘛。反正这东西只初始化一次,占不了多少k。新程序如下:
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
7
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
8
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
9
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
10
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
11
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
12
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
13
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
14
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
15
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
16
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
17
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
18
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
19
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
20
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
21
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
22
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
23
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
24
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
25
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
26
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
27
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
28
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
29
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
30
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
31
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
32
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
33
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
34
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
35
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
36
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
37
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
38
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
39
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
40
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
41
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
42
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
43
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
这样的话,对于每一个字符,只进行几个简单的操作了:
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倍。
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
5
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/None.gif)
2
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedBlockStart.gif)
3
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
4
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockStart.gif)
5
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/InBlock.gif)
6
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedSubBlockEnd.gif)
7
![](https://xiaotie.cnblogs.com/Images/OutliningIndicators/ExpandedBlockEnd.gif)
测试结果: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)
申明
非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!
博文欢迎转载,但请给出原文连接。