腾讯C#脚本GC测试真相

string使用+号拼接 和 stringbuilder

void testStringBuilder_plus()

{

 string test = "abc" + "efg" + "h";

int index = test.Length;

}

 

void testStringBuilder_StringBuilder()

{

StringBuilder testData = new StringBuilder();

testData.Append("abc");

testData.Append("efg");

testData.Append("h");

string test = testData.ToString();

}

 

数据结论

不同的使用场景结果是不同的,+ 号在几次连接中没有产生 GC。而在大量的连

接过程中,产生大量的 GC。

意义

连接次数只有几次(10 以内),此时应该直接用 + 号连接,不产生 GC。实际

上,编译器已经做了优化。

其余的使用 StringBuilder,StringBuilder 内部 Buffer 的缺省值为 16,

按 StringBuilder 的使用场景,Buffer 肯定得重新分配。经验值一般用 256 作

为 Buffer 的初值。当然,如果能计算出最终生成字符串长度的话,则应该按这

个值来设定 Buffer 的初值。使用 new StringBuilder(256) 就将 Buffer 的初始

长度设为了 256。

struct 和 class 比较

数据结论

Struct 在栈中不产生 GC,class 在堆中,会产生 GC。

对 Struct 的结点修改时,修改完以后记得重新赋值。因为 Struct 赋值是 copy

而不是引用,修改完以后,以前的不生效。

意义

堆栈的空间有限,对于大量的逻辑的对象,创建类要比创建结构好一些。

结构表示轻量对象,并且结构的成本较低,适合处理大量短暂的对象。

在表现抽象和多级别的对象层次时,类是最好的选择。

大多数情况下该类型只是一些数据时,结构是最佳的选择。

Enum 真相

数据结论

TestStr() 有装箱发生。

TestDic(),在构造集合的时候,也会有 GC 的产生。

意义

不要把枚举当 Tkey 使用,不要把枚举转成 string 使用。

 

协成

Component 相关优化

Transform

使用内建的数组,比如用 Vector3.zero 而不是 new Vector(0, 0, 0);

transform.localRotation = Quaternion.Euler(Vector3.zero);

transform.localScale =Vector3.one;

transform.localPosition =Vector3.one;

GameObject 相关优化

(脚本和本地引擎 C++代码之间的通信开销)

Gameobject 缓存:类似组件的缓存策略。

查找对象标签:if (go.CompareTag (“xxx”)来代替 if (go.tag == “xxx”),

因为内部循环调用对象分配的标签属性以及拷贝额外内存。

SendMessageUpwards、SendMessage:少用这两个函数,使用委托替代。

缓存组件:调用 GetComponent 函数耗性能,用变量先缓存到内存在使用, 有

必要时记得更新缓存组件。

未完待续.................

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值