zoukankan      html  css  js  c++  java
  • 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)

    申明

    非源创博文中的内容均收集自网上,若有侵权之处,请及时联络,我会在第一时间内删除.再次说声抱歉!!!

    博文欢迎转载,但请给出原文连接。

  • 相关阅读:
    USACO 3.3 A Game
    USACO 3.3 Camelot
    USACO 3.3 Shopping Offers
    USACO 3.3 TEXT Eulerian Tour中的Cows on Parade一点理解
    USACO 3.3 Riding the Fences
    USACO 3.2 Magic Squares
    USACO 3.2 Stringsobits
    USACO 3.2 Factorials
    USACO 3.2 Contact
    USACO 3.1 Humble Numbers
  • 原文地址:https://www.cnblogs.com/Athrun/p/823368.html
Copyright © 2011-2022 走看看