C# GC

  1. List的第二种遍历方法有GC产生:

(1) ListFindIndex会产生GC,原因还不知道,需要反编译来看。

 

 

 

  1. CSActivityInfo.SetXueYueZhiYe()

对于字符串产生的GC:

  1. 避免频繁调用分割字符串。
  2. 作为系统字符串处理。
  3. 如果同一个字符串的频繁操作,使用StringBuilder代替

 

 

 

 

 

 

 

3. SetShenglongyabiao():

字典内存大小:

(1) 字典在存储第一个遍历时会创建一个散列表来维护,创建散列表的过程会产生变量。所以在已经存储了数据后,再频繁clear()是会产生很多GC.

https://blog.csdn.net/zhaoguanghui2012/article/details/88105715

 

4.Foreach遍历

会产生GC,5.6以前的unity版本,因为有装箱操作。

 

CSActivityInfo.GetCombinDaysInShenLong()

CSActivityInfo.ActiveData.ActiveData()

Utility.GetDragonEmpireCountDown();

 

5.对ToString()有频繁调用:

优化前:

 

 

 

 

 

 

优化后:

其实可以把DayOfWeek缓存下。或者把string转成long 秒时间来比较大小。

 

 

 

 

 

 

 

6.

优化前:频繁分割字符串,产生GC.

 

 

 

 

优化后:

缓存tab数据 ;  mtbSundryData

 

 

 

 

优化前:

 

 

 

 

 

 

优化后:

Tableid是不变的,那么Tab不变,创建的对象是不变的。素所以没必要每次都New.

 

 

 

 

7.

优化前:

相加,再排序

 

 

 

 

 

 

 

8. 优化后:

  1. List如果存储枚举,使用Contains()函数时,则会有内存泄漏。如果存储int则不会。

 

 

 

 

优化:可以使用第二种方式代替第一种方式

 

 

有序数组的查找 

int middle = left + ((right - left) >> 1);  

右移相当于除以 2^1  

尖尖朝左左移,乘法;尖尖得值就是a ==> a*b^n

print(3 << 1); //6

print(1 << 3);//8

尖尖朝右右移, 除法;括号得值就是a ==> a/b^n

 print(8 >> 2);//2

0-16】 4

第一轮: 缩小范围到 0-7;indexR-1 = 6 左移一位。

第二轮: 6/2=3 3<4    indexL+1=4 缩小范围到[4-6].

第三轮: ....

    int  BinarySearch(int[] array,int n,int value)

    {

        int left = 0;

        int right = n - 1;

        while (left <= right)  

        {

            //(1).算出中间元素的index

            int middle = left + ((right - left) >> 1);  //右移  <=>除以  2^1  

            //(2)中间索引元素>值  ==> IndexR-1  向左移动

            if (array[middle] > value)  

            {

                right = middle - 1;  

            }

            //(3)中间索引元素<值 ==> IndexL+1  向右移动

            else if (array[middle] < value)

            {

                left = middle + 1;

            }

            //(4)当前索引=值 ==>返回该值

            else

                return middle;

        }

        return -1;

}

 

字符串包含

String 1:ABCD    String 2:BAD

答案是true,即String2里的字母在String1里也都有,或者说String2是String1的真子集。

Hash 其实就是一个签名

1248  2^0 + 2^1 + 2^2 + 2^3=15  

    // bool isExist = StringContain("ABCD", "ABC");

    //把字符串存成一个签名

    bool StringContain(string a, string b)

    {

        int hash = 0;

        for (int i = 0; i < a.Length; ++i)

        {

            char c = a[i];

            int val = c;// - 'A';

            int move = (1 << val);

            hash =hash | move;       //当且仅当两个操作数均为 false时,结果才为 false。

        }

        for (int i = 0; i < b.Length; ++i)

        {

            char c = b[i];

            int val = c;// - 'A';

            int move = 1 << val;

            if ((hash & move) == 0) //& 当且仅当两个操作数均为 true 时,结果才为 true。

            {

                return false;

            }

        }

        return true;

    }

 

posted on 2020-06-05 21:02  horizonYJ  阅读(697)  评论(0编辑  收藏  举报

导航