gpt4 book ai didi

c# - List 与数组性能

转载 作者:太空狗 更新时间:2023-10-30 00:31:31 25 4
gpt4 key购买 nike

我尝试设置 List

List< int > a;
//...
a[i] = X;

ilspy 显示设置编译为:

callvirt instance void class [mscorlib]System.Collections.Generic.List`1<int32>::set_Item(int32, !0)

但是这段代码

int[] b;
//...
b[i] = Y;

编译为

stelem.i4

在我的基准测试中,速度快了 7 倍。

据我所知,虚拟电话比 stelem 更贵。是否可以将 List< T > 与数组性能一起使用

更新

代码:

   static void Main(string[] args)
{
int N = int.Parse(args[0]);
int M = int.Parse(args[1]);

var sw = new Stopwatch();
sw.Start();
int[] a = new int[N];
for (int k = 0; k < M; ++k)
{
for (int i = 0; i < N; ++i)
{
a[i] = i * 2;
a[i] -= i;
a[i] += 1;
}
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds + ":" + a[N - 1]);

var b = new List<int>(N);
for (int i = 0; i < N; ++i)
{
b.Add(0);
}
sw.Restart();
for (int k = 0; k < M; ++k)
{
for (int i = 0; i < N; ++i)
{
b[i] = i * 2;
b[i] -= i;
b[i] += 1;
}
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds + ":" + b[N - 1]);
}

运行并输出:

> ./Console.exe 1000000 100

166:1000000
1467:1000000

最佳答案

没有。

List<T>包装一个数组,它有一些必要的开销(首先因为它是一个类)。插入和删除等操作的成本也很高,特别是当它导致重新排序列表中的所有其他元素时。

如果您不想要 List<T> 的开销或者需要动态大小、插入和删除等功能,请使用数组。如果您想要或需要使用 List<T> , 接受性能损失。

您将很难编写出比 .NET BCL 团队所做的更高效的代码,尤其是在调整数组大小和其他可以受益于直接访问底层内存/操作系统功能的操作时。

关于c# - List<T> 与数组性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25282632/

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