我尝试设置List <int>值
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团队相比,您将很难编写更有效的代码,尤其是在调整数组大小和其他可直接访问底层内存/ OS函数的操作中受益的操作时。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句