C# GC
- List的第二种遍历方法有GC产生:
(1) List的FindIndex会产生GC,原因还不知道,需要反编译来看。
- CSActivityInfo.SetXueYueZhiYe()
对于字符串产生的GC:
- 避免频繁调用分割字符串。
- 作为系统字符串处理。
- 如果同一个字符串的频繁操作,使用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
优化前:
优化后:
Table的id是不变的,那么Tab不变,创建的对象是不变的。素所以没必要每次都New.
7.
优化前:
相加,再排序
8. 优化后:
- 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;
}