众所周知,如果我们将一个值类型的变量与null进行比较,这将导致装箱引起的GC分配:
{
public class TestGeneric<T>{
public static bool TestGC(T key)
{
return key == null;
}
}
TestGeneric<int>.TestGC(10);
}
然而,我发现LinkedList(System.Collections.Generic)的Find(T value)方法使用了与以下代码相同的代码
public LinkedListNode<T> Find(T value)
{
if (value != null)
{
//....
}
}
但是像这样的调用
//LinkedList<int> list;
list.Find(10);
不会引起任何GC分配。
我真的很困惑。有人有想法吗?请帮忙。非常感谢。
====================
测试环境:Unity 2018,Unity Profiler(启用深度分析),.Net版本:4.0
这是我的测试代码。
public class TestGeneric<T> {
public static bool TestGC(T key)
{
return key == null;
}
}
public class LinkedListTest : MonoBehaviour
{
LinkedList<int> list = new LinkedList<int>();
void Start()
{
for (int i = 0; i < 10; ++i)
{
list.AddLast(i);
}
}
void Update()
{
for (int i = 0; i < 10; ++i)
{
TestGeneric<int>.TestGC(10);
}
for (int i = 0; i < 10; ++i)
{
list.Find(100);
}
}
}
Unity分析器显示:
TestGC方法每帧引起了200字节的GC分配。
list.Find方法每帧引起了0字节的GC分配。
if(match(_items[i]))
来比较值,我不确定那是什么意思 :D - Milos Romanic