(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程序优化心得(三)相关推荐

  1. Ogre渲染优化心得(三) -- 优化天龙八部的地形

    地形的实现,一种是用拼格子,每个格子一个四边形,不共用顶点,不能lod,但是一个格子就可以多层纹理,适合2.5D视角游戏,比如魔兽3和天龙 另一种就是主流3D游戏做法,共用顶点,lod,缺点是一个地形 ...

  2. C++应用程序性能优化(三)——C++语言特性性能分析

    C++应用程序性能优化(三)--C++语言特性性能分析 一.C++语言特性性能分析简介 通常大多数开发人员认为,汇编语言和C语言比较适合编写对性能要求非常高的程序,C++语言主要适用于编写复杂度非常高 ...

  3. 【genius_platform软件平台开发】第八十二讲:ARM Neon指令集一(ARM NEON Intrinsics, SIMD运算, 优化心得)

    1. ARM Neon Intrinsics 编程 1.入门:基本能上手写Intrinsics 1.1 Neon介绍.简明案例与编程惯例 1.2 如何检索Intrinsics 1.3 优化效果案例 1 ...

  4. 中国电子学会图形化四级编程题:程序优化

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 我们将有关编程题目的教学视频已经发布到抖 ...

  5. 【青少年编程】【四级】绘图程序优化

    「青少年编程竞赛交流群」已成立(适合6至18周岁的青少年),公众号后台回复[Scratch]或[Python],即可进入.如果加入了之前的社群不需要重复加入. 微信后台回复"资料下载&quo ...

  6. “提高一下dotnet程序的效率一”中关于exception的问题

    看了提高一下dotnet程序的效率一中关于exception的部分和相关的评论,我觉得有些知识点可能大家平时没有注意到或没有深入的了解: Exception在没有产生exception的时候,换句话说 ...

  7. 推荐CUDA程序优化的15个策略

    推荐CUDA程序优化的15个策略 0条评论 2011-07-06 09:48   来源:潇湘学子岳麓生的博客 作者: 潇湘学子岳麓生 编辑: 王玉圆 [IT168 技术]在<CUDA程序优化策略 ...

  8. GPU 编程入门到精通(五)之 GPU 程序优化进阶

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GP ...

  9. GPU 编程入门到精通(四)之 GPU 程序优化

    版权声明:本文为博主原创文章,未经博主允许不得转载. 目录(?)[+] 博主由于工作当中的需要,开始学习 GPU 上面的编程,主要涉及到的是基于 GPU 的深度学习方面的知识,鉴于之前没有接触过 GP ...

最新文章

  1. linux 基础命令一
  2. 2021年全国大学生智能汽车竞赛山东赛区比赛顺利进行
  3. 今天看到一个很个性的blog
  4. Windows server 2003 DHCP全攻略(二)
  5. linux系统UDP的socket通信编程
  6. 注解配置声明式事务控制解析
  7. 【动态规划】01背包问题
  8. python实现Trie 树+朴素匹配字符串+RK算法匹配字符串+kmp算法匹配字符串
  9. 手机端使用ghelper_Anki手机端使用指南(一)
  10. 我的程序跑了 60 多小时,就是为了让你看一眼 JDK 的 BUG 导致的内存泄漏
  11. 力扣每日一题 2021.10.23
  12. IE9为啥没有加载进度进度提示
  13. 邮件服务器向hotmail等邮箱发信收到退信的解决方法
  14. WINDOW10初步使用
  15. Android技巧:ListView去掉橙黄底色
  16. python七大神级插件_Maya神级插件 SOuP 和OpenVDB
  17. Docker使用redis
  18. 较低成本的ISO7637-2 5A 5B抛负载保护方案
  19. 基于c语言图书管理系统设计与开发,基于C语言图书管理系统设计与实现.doc
  20. mfs java_mfs权威指南

热门文章

  1. 2020身高体重标准表儿童_男女孩最新身高标准表,你家孩子达标了吗?(附增高秘籍)...
  2. oracle几个网络,ORACLE网络的几个重点概念
  3. mysql排序区分大小写吗_MySQL操作数据时区分大小写
  4. matlab与专业应用,MATLAB应用技术--在电气工程与自动化专业中的应用
  5. 指针强制类型转换触发内存自动对齐
  6. (五)C语言之二维数组
  7. 如何避免mysql回表查询_mysql如何避免回表查询
  8. 计算机开机时间停在上次关机,怎么在电脑开机的时候查看上次关机前的操作
  9. c语言判断整数_用c++编写闰年的判断基础程序
  10. 量子计算机怎么编程,量子计算机编程(一)——QPU编程