gpt4 book ai didi

c#悖论: Converting List to Array is Iterating more efficient?

转载 作者:行者123 更新时间:2023-11-30 18:58:24 28 4
gpt4 key购买 nike

列表基准:大小=1000,运行=50000,总时间=19.5 秒

var list = new List<string>(Size);
for (int i = 0; i < Size; i++) list.Add(i.ToString());

var b = new Benchmark();
b.Test("TestListIteration", () =>
{
c = 0;
for (int i = 0; i < Runs; i++)
{
for (int j = 0; j < Size; j++)
{
c += list[j].Length;
}
}
});

列表到数组基准:大小=1000,运行次数=50000,总时间=15.449

var list = new List<string>(Size);
for (int i = 0; i < Size; i++) list.Add(i.ToString());

var b = new Benchmark();
b.Test("TestListIteration", () =>
{
c = 0;
for (int i = 0; i < Runs; i++)
{
var array = list.ToArray(); //Changed line here !!!
for (int j = 0; j < Size; j++)
{
c += array[j].Length;
}
}
});

这不是悖论吗?

如何执行两个 Action
a) 将整个列表转换为数组和
b) 遍历整个数组。
比单独执行 b(迭代列表)更快。

如果是这种情况,则意味着世界上编写的所有代码都是错误的。对于这种情况,我们应该有所预测。列表中的每个“For”循环都应在开始前自动调用 .ToArray。即使数组稍后被丢弃。

编辑:这里是根据“大小”的结果。

大小=10,运行次数=5000000:列表获胜列表:20.362,ListToArray:37.36

大小=100,运行次数=500000:列表获胜列表:19.64,ListToArray:23.162

大小=1000,运行次数=50000:ListToArray 获胜列表:19.5,ListToArray:15.449

大小=10000,运行次数=5000:ListToArray 胜出列表:20.094,ListToArray:14.453

大小=10000000,运行次数=5:计算机死机

最佳答案

Isn't this a paradox?

没有。

How can performing two actions a) converting entire list to array and b) iterating entire array. Be faster than doing b alone (iterating list)?

将列表转换为数组非常快

列表元素的迭代比数组元素的迭代稍微慢

为什么这些都是真的?

因为 (1) 列表是隐藏在幕后的数组,(2) 数组到数组的复制经过了大量优化——它是通过直接转到硬件来完成的,而不是通过迭代每个元素并一次复制一个-- 因此列表到数组的复制也进行了大量优化,并且 (3) 列表索引只是数组索引加上一些更多的工作,因此列表索引必须稍微慢一些。

正如您所发现的,当您在一件非常快的事情与许多稍慢的事情之间取得平衡时,就会出现一个胜过另一个的点。

If this is the case, then it means than all code written in the world is wrong.

不,它没有。

We should have predicted for this case.

不,我们不应该为此担心。不相信我?今天在市场上给我找一个产品,它的成功或失败完全取决于选择快几毫秒的列表迭代技术。

And each "For" loop on a list should automatically call .ToArray before it starts.

绝对不是。即使我们知道它更快(我们不知道),也有很多种性能需要担心。 为了节省几毫秒而将使用的内存量加倍直接违背了最小化内存使用量的性能目标!并不是每个人都关心原始速度。

在您的情况下,50000 次运行的差异是 4000 毫秒,因此每次运行节省的时间不到十分之一毫秒。如果您关心那十分之一毫秒,那么一定要对您的代码进行此更改。

关于c#悖论: Converting List to Array is Iterating more efficient?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44395265/

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