【发布时间】:2012-05-17 11:15:57
【问题描述】:
我和我的同事有一点争议(这非常接近圣战:)),关于通过枚举器通过 indeces VS 访问列表的性能。为了操作一些事实,我编写了以下测试:
static void Main(string[] args)
{
const int count = 10000000;
var stopwatch = new Stopwatch();
var list = new List<int>(count);
var rnd = new Random();
for (int i = 0; i < count; i++)
{
list.Add( rnd.Next());
}
const int repeat = 20;
double indeces = 0;
double forEach = 0;
for (int iteration = 0; iteration < repeat; iteration++)
{
stopwatch.Restart();
long tmp = 0;
for (int i = 0; i < count; i++)
{
tmp += list[i];
}
indeces += stopwatch.Elapsed.TotalSeconds;
stopwatch.Restart();
foreach (var integer in list)
{
tmp += integer;
}
forEach += stopwatch.Elapsed.TotalSeconds;
}
Console.WriteLine(indeces /repeat);
Console.WriteLine(forEach /repeat);
}
实际上,它只是访问元素。
正如我所料,索引访问速度更快。这是在我的机器上发布构建的结果:
0.0347//index access
0.0737//enumerating
不过,我决定稍微改变一下测试:
//the same as before
...
IEnumerable<int> listAsEnumerable = list;
//the same as before
...
foreach (var integer in listAsEnumerable)
{
tmp += integer;
}
...
现在输出如下:
0.0321//index access
0.1246//enumerating (2x slower!)
如果我们通过接口枚举同一个列表,性能会慢2倍!
为什么会发生这种情况?
this 表示“通过接口枚举比枚举实际列表慢 2 倍”。
我的猜测是运行时使用不同的Enumerators:列表在第一个测试中,而在第二个测试中是通用列表。
【问题讨论】:
标签: c# performance list ienumerable