我在C#中发现了一些奇怪的东西。我有类A,只包含一个对A的引用。然后我在for循环里面的每个迭代中创建一个新对象A,在以前的迭代中创建的对象。但是,如果我更改对for循环之前创建的对象的引用,速度会更快。为什么是这样?用引用创建类的不同表现
class A
{
private A next;
public A(A next)
{
this.next = next;
}
}
var a = new A(null);
for (int i = 0; i < 10*1000*1000; i++)
a = new A(a);
// Takes 1.5s
var b = new A(null);
for (int i = 0; i < 10*1000*1000; i++)
a = new A(b);
// Takes only 0.17s
我实现用常规方法不变堆栈的过程中发现这一点,并throught VList这是由于快得多。
有人猜测,这是因为在第二种情况下,每次调用“a = new A(b)”时,对旧的“A”实例的引用都会丢失,因此CLI可以重新使用其内存。在第一种情况下,必须分配额外的内存来保存您创建的1000万个实例,因为您不断引用它们。 –
小提示,但做这样的时间测试时,总是做一些基本的理性/正确性检查数据,特别是当你看到这样的天文数据不同的时间结果。你不想对快速但不正确的解决方案太过兴奋。正如他们所说,给错误结果两倍的东西无限慢。 –