gpt4 book ai didi

c# - 引用创建类的不同表现

转载 作者:太空宇宙 更新时间:2023-11-03 19:04:34 25 4
gpt4 key购买 nike

我在 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

我在以通常方式实现不可变堆栈的过程中发现了这一点,并通过 VList这是因为速度要快得多。

最佳答案

此代码(您的第二个代码段):

var b = new A(null);
for (int i = 0; i < 10*1000*1000; i++)
a = new A(b);

在功能上等同于此代码:

 var b = new A(null);
a = new A(b);

您的第一个片段不一样:

var a = new A(null);

for (int i = 0; i < 10*1000*1000; i++)
a = new A(a);

虽然看起来你扔掉了除了最后一个引用之外的所有东西,但事实并非如此。 A 的最后一个实例有一个对前一个的引用,它有一个对前一个的引用,它引用了前一个……一直追溯到 10,000,000 个对象。难怪它变慢了。

所以比较两段实际上没有达到相同结果的代码是没有意义的。使用实际有效的那个(你的第一个片段)而不是第二个。运行速度较慢的代码肯定比运行速度较快但不起作用的代码要好。

最后,C# 有一个非常好的集合类选择(比如 List<T> ),它们工作得很好。不确定为什么要在这里重新发明轮子。

关于c# - 引用创建类的不同表现,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30332422/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com