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,一经查实,立即删除!

相关文章

java网页解析包_java 网页解析工具包 Jsoup

Jsoup是一个非常好的解析网页的包&#xff0c;用java开发的&#xff0c;提供了类似DOM&#xff0c;CSS选择器的方式来查找和提取文档中的内容。相关资料如下&#xff1a;今天做了一个Jsoup解析网站的项目&#xff0c;使用Jsoup.connect(url).get()连接某网站时偶尔会出现java.n…

C++/CLI思辨录之传递托管堆地址

新的C特点平衡了把托管堆的地址传递到非托管代码的能力。早期我们遇到的最大问题是&#xff0c;在托管堆中的对象的位置是非静态的。垃圾收集器以变化的时间间隔移动对象。现在新的pin_ptr(别针型指针)的引入禁止垃圾收集器改变在堆上的对象的地址。下面代码展示了别针型指针的…

【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…

java比较字符能用等于号码_Java字符串比较,==,等于,匹配,compareTo()之间的差异。...

的equals()方法将此字符串与指定的对象进行比较。当且仅当参数不为null并且是一个String对象&#xff0c;表示与此对象相同的字符序列时&#xff0c;结果为true。示例public class Sample{public static void main(String []args){String s1 "nhooo";String s2 &qu…

[SQL Server]用于压力测试和性能分析的两个支持实用工具[转]

微软有两个不提供支持服务的SQL Server压力测试和性能分析工具。具体看微软知识库&#xff1a;http://support.microsoft.com/?kbid887057 分别是&#xff1a;Read80Trace utility 和 OSTRESS utility 它们的下载地址请参看&#xff1a; http://www.microsoft.com/downloads…

【Mininet】Mininet可视化应用

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

java 队列复制_复制一个文件夹里的文件到另一个目录下 (使用队列的方法实现)...

最近在由于准备实习&#xff0c;在学android&#xff0c;也会用到Java&#xff0c;所以想实现复制文件夹的功能&#xff0c;当然也参考了别人的代码。这里是我参考的网址&#xff1a;http://blog.csdn.net/etzmico/article/details/7786525/我发这个文章的主要目的是为了永久性…

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

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

asp.net里导出excel表方法汇总

1、由dataset生成 public void CreateExcel(DataSet ds,string typeid,string FileName) { HttpResponse resp; resp Page.Response; resp.ContentEncoding System.Text.Encoding.GetEncoding("GB2312"); resp.AppendHeader("Content-Disposition", &quo…

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;由于本次…

HTML 标记一览

标记 类型 名称或意义 作用 备注文件标记<HTML> ● 文件宣告 让浏览器知道这是 HTML 文件 <HEAD> ● 开头 提供文件整体信息 <TITLE> ● 标题 定义文件标题&#xff0c;将显示于浏览器顶端 <BODY> ● 主体 设计文件格式及内容所在 排版标记<!--注解…

【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_…

[CityLife]“背后的故事”---贫嘴曾志伟

受伤后&#xff0c;很久不曾看电视了&#xff0c;最晚打开电视机看了湖南卫视的一档节目: “背后的故事”---贫嘴曾志伟的幸福生活(上&#xff09;他个子矮小&#xff0c;却快乐豁达。父有名而不以父为名。有女&#xff0c;女娇却是 父以女骄。他讲自己曾经5块钱过了2周&#x…

【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…

FreeBASIC

最近有个国外的客户来信问我们的产品是否支持FreeBASIC。上去看了一下&#xff0c;是个QuickBASIC仿制品&#xff0c;支持DOS、Windows、Linux。运行了一下&#xff0c;感觉挺简单的&#xff0c;可以最大限度地兼容QB&#xff0c;在兼容性上比其他用过的BASIC要好。其实类似的B…

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是…

React+umi+antdesign实现上传文件组件(阿里云)

开始之前需要封装一个上传的方法fileUtils.ts import { message } from antd; import Base64 from crypto-js/enc-base64; import Utf8 from crypto-js/enc-utf8; import HmacSHA1 from crypto-js/hmac-sha1; import { request } from umi;const isDev process.env.NODE_ENV …