dotnet程序优化心得(三)

(4)继续优化――用空间换取时间

现在对每一个字符,都要用get_Item(object key)方法过一遍,可这个乖乖方法那么长,肯定太耗时间了,能不能用更简单的手段呢?改Hashtable?哇,那代码,叫一个看不懂。仔细琢磨琢磨,有了,直接用数组!每一个汉字对应一个Int16,以该值为索引,数组中在那个位置的值为值,这样最快速了。就是占点空间,内存便宜嘛。反正这东西只初始化一次,占不了多少k。新程序如下:

 1None.gifpublic class QuickChineseConvert
 2ExpandedBlockStart.gifContractedBlock.gifdot.gif{
 3InBlock.gif    static char[] _lib;
 4InBlock.gif    static int _size;
 5InBlock.gif
 6InBlock.gif    static QuickChineseConvert()
 7ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
 8InBlock.gif        _size=UInt16.MaxValue;
 9InBlock.gif        Init();
10ExpandedSubBlockEnd.gif    }

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

20ExpandedSubBlockEnd.gif    }

21InBlock.gif
22InBlock.gif    private static void Init()
23ExpandedSubBlockStart.gifContractedSubBlock.gif    dot.gif{
24InBlock.gif        _lib = new char[_size];
25InBlock.gif        PushIntoArray(_lib,GB_lib,BIG5_lib);
26ExpandedSubBlockEnd.gif    }

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

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

41InBlock.gif        return sb.ToString();
42ExpandedSubBlockEnd.gif    }

43ExpandedBlockEnd.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倍。

1None.gif                public static void ToBIG5(ref char inputChar)
2ExpandedBlockStart.gifContractedBlock.gif                dot.gif{
3InBlock.gif                        char temp = LibGB2BIG5[Convert.ToUInt16(inputChar)];
4InBlock.gif                        if (temp!=0) inputChar=temp;
5ExpandedBlockEnd.gif                }

1None.gif                public static void ToBIG5(ref char[] inputString)
2ExpandedBlockStart.gifContractedBlock.gif                dot.gif{
3InBlock.gif                        for (int i=0;i<inputString.Length;i++)
4ExpandedSubBlockStart.gifContractedSubBlock.gif                        dot.gif{
5InBlock.gif                                inputString[i]=ToBIG5(inputString[i]);
6ExpandedSubBlockEnd.gif                        }

7ExpandedBlockEnd.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)

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/549996.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【Mininet】Mininet使用源码安装

实验参考&#xff1a; Mininet使用源码安装 实验步骤&#xff1a; 1. 更新软件&#xff08;用#sudo apt-get update与#sudo apt-get upgrade&#xff09;。 2. 从github上获取mininet源码&#xff08;#git clone git://github.com/mininet/mininet&#xff09;。 3. 获取完后&a…

【Mininet】Mininet可视化应用

实验参考&#xff1a; Mininet可视化应用 实验步骤&#xff1a; 1. 用命令启动mininet可视化界面&#xff08;#cd mininet/mininet/example #./miniedit.py&#xff09;&#xff0c;同时开启另一终端打开Opendaylight。 2. 用鼠标选择左侧的对应的网络组件&#xff0c;然后在空…

【Mininet】Mininet命令延伸实验扩展

实验参考&#xff1a; Mininet命令延伸实验扩展 实验步骤&#xff1a; 1.用命令实现 #sudo mn --topo minimal #最小的网络拓扑&#xff0c;一个交换机下挂两个主机。 #sudo mn --topo linear,4 #每个交换机连接一个主机&#xff0c;交换机间相连接。本例&#xff1a;4个主机&a…

java非检查性异常有哪些_Java异常处理-检查性异常、非检查性异常、Error

一、Java异常处理详解异常.png目录&#xff1a;1.java中异常的分类1.1 异常(Exception)1.1.1 运行时异常(RuntimeException)可以不需要捕获1.1.2 编译异常(IOException)编译器会提示要捕获&#xff0c;如果不进行捕获则编译器会报错1.2 错误(Error)3.java处理异常机制4.throw和…

【Mininet】基于Mininet测量路径的损耗率

实验参考&#xff1a; 基于Mininet测量路径的损耗率 SDN常用控制器安装部署之POX篇 实验步骤&#xff1a; 1. 在装有mininet的虚拟机中新建文件mymininet.py并编辑以下内容&#xff0c;这里要注意一点&#xff0c;文中的dp0与dp1须填POX安装的虚拟机的地址&#xff0c;由于本次…

【Mininet】Mininet设置带宽之简单性能测试

实验参考&#xff1a; Mininet设置带宽之简单性能测试 实验步骤&#xff1a; 1. 进入mininet/custom目录下&#xff0c;通过vi mymininet1.py创建脚本并添加内容&#xff08;本实验通过python脚本自定义拓扑&#xff0c;创建包含一个交换机、四个主机的网络拓扑&#xff09;&am…

java 配置tocat_Tomcat安装配置及Eclipse配置详解

整个安装过程我们先学习安装jdk和配置然后是安装tomcat和配置&#xff0c;最后我们学习安装eclipse和配置以及web程序的使用和发布举例1. 安装jdk和配置(1)下载jdk安装包&#xff1a;(2)按照步骤点击下一步进行jdk软件的安装。(3)配置javajdk的环境变量**配置环境变量包括java_…

【Mininet】Mininet动态改变转发规则实验

实验参考&#xff1a; Mininet动态改变转发规则实验 SDN常用控制器安装部署之POX篇 实验步骤&#xff1a; 1. 在装有POX的虚拟机里&#xff0c;/root/pox目录下新建文件lab_controller.py&#xff0c;并编辑以下内容&#xff1a; 1 from pox.core import core2 3 import pox.o…

php搜索图片不显示不出来了,PHP CURL采集百度搜寻结果图片不显示问题的解决方法【第1/4页】...

1.根据关键字采集百度搜寻结果根据关键字采集百度搜寻结果&#xff0c;可以使用curl实现&#xff0c;代码如下&#xff1a;<?php function doCurl($url, $dataarray(), $headerarray(), $timeout30){$ch curl_init();curl_setopt($ch, CURLOPT_URL, $url);curl_setopt($ch…

数据库,XML,MDB --- 我们来TXT...

数据库,XML,MDB --- 我们来TXT... 转贴请注明来自http://blog.csdn.net/a11s 作者:董含君 blog已经迁移到http://a11s.cnblogs.com呵呵,有数据库当然用数据库,SQL Server多好用, mySQL多好用... 不能给客户端随便装服务啊,那就access或者其他单机的xsl之类,或者干脆XML XML是…

php文件怎么设置隐藏显示代码,php文件隐藏的方法

php文件隐藏的方法&#xff1a;1、在“httpd.conf”里任意位置添加代码为“AddType application/x-httpd-php .asp .py .pl .jsp aspx”&#xff1b;2、对PHP使用未知扩展名。隐藏你的.php文件今天做PHP在线手册镜像的时候看到了这个方法,哈哈,以前都没有注意到,所以说,手册是最…

【Mininet】Mininet脚本实现控制交换机行为

实验参考&#xff1a; Mininet脚本实现控制交换机行为 实验步骤&#xff1a; 1. 一台交换机两台主机&#xff0c;实现从1端口进入的数据流转发到2端口&#xff0c;从2端口进入的数据流转发到1端口。 1. 创建新文件mymininet1.py并编辑以下内容&#xff08;注意要将控制器设置为…

matlab2018b中svm无法运行,关于matlab2018a版本错误使用 svmclassify 分类器

当我们照常使用分类器函数svmclassify时&#xff0c;2018版的matlab会报出以下错误&#xff1a;解决办法&#xff1a;1&#xff0c;下载libsvm(一般下载最新版本就ok了)包&#xff0c;并将其添加至matlab的toolbox文件里。并打开matlab编辑器&#xff0c;主页 / 设置路径 / 添…

【Mininet】Mininet MAC地址学习实验

实验参考&#xff1a; Mininet MAC地址学习实验 实验步骤&#xff1a; 1. 在虚拟机上启动mininet&#xff0c;创建一个线型拓扑&#xff08;如下图所示&#xff09;&#xff0c;控制器设置为无&#xff08;# sudo mn –-topo linear –-mac –-switch ovsk –-controllernone&a…

【Mininet】基于Mininet的VxLAN实验

实验参考&#xff1a; 基于Mininet的VxLAN实验 实验步骤&#xff1a; 1. 如下图所示&#xff0c;在两台虚拟机中利用mininet创建两个网络&#xff0c;利用VxLAN连通这两个mininet环境。关闭默认的控制器后&#xff0c;通过下发流表确保网络的连通性&#xff1a; 2. 先查看两台虚…

Ajax基石脚本异步并发调用参数传递

在Ajax开发框架中&#xff0c;最基本的划分是服务器端和客户端。服务器端相对来说比较简单&#xff0c;只要是可以开发动态网页的语言都可以胜任&#xff1b;客户端浏览器就是JScript/JavaScript的天下了&#xff0c;好像没有看到有VBScript做的Ajax客户端库&#xff0c;就算它…

matlab disteclud,机器学习实战ByMatlab(3)K-means算法

K-means算法属于无监督学习聚类算法&#xff0c;其计算步骤还是挺简单的&#xff0c;思想也挺容易理解&#xff0c;而且还可以在思想中体会到EM算法的思想。K-means 算法的优缺点&#xff1a;1.优点&#xff1a;容易实现2.缺点&#xff1a;可能收敛到局部最小值&#xff0c;在大…

智能安全实验室-Defendio杀马2.4.0.420-实时防护-内存防护、新浏览器导航界面...

智能安全实验室&#xff0d;杀马(Defendio) 2.4.0.420 &#xff1a;实时防护&#xff0d;内存防护、新浏览器导航界面等 详细信息请访问&#xff1a;http://unruledboy.cnblogs.com/archive/2006/02/02/Defendio.html怎样获取最新版本&#xff1f;□智能更新&#xff1a;打开现…

【RTOS】基于V7开发板的最新版FreeRTOS V10.2.0程序模板,含MDK和IAR,支持串口打印任务执行情况...

模板下载&#xff1a; 链接&#xff1a;https://pan.baidu.com/s/1N32Hx7cTbDoRinuzTUB3zw 提取码&#xff1a;6aox 1、MDK使用MDK5.26及其以上版本。 2、IAR使用IAR8.30及其以上版本。 3、教程直可以先看之前发布的&#xff0c;除了新增的一些功能&#xff0c;其它功能基本…

自动图片轮播php源码,js实现自动图片轮播代码

本文实例为大家分享了轮播的具体代码&#xff0c;自动轮播&#xff0c;居中显示&#xff0c;供大家参考&#xff0c;具体内容如下#div1{width: 192px;height: 120px;border: 1px solid gray;margin: 0 auto;position: relative;overflow: hidden;}#div1 img{position: absolute…