Pav*_*sov 16 .net contains list indexof
我有List有150K元素.平均工作时间IndexOf()比Contains()低4倍.我试着使用List of int.对于字符串列表,IndexOf有点快.
我发现只有一个主要区别,它的属性为TargetedPatchingOptOut.MSDN告诉:
表示应用此属性的.NET Framework类库方法不太可能受到服务版本的影响,因此有资格在本机映像生成器(NGen)映像中内联.
这个属性可能是这种行为的原因吗?为什么方法Contains()没有这样的属性?
提前致谢.
编辑:
我有这样的代码:
List<int> list = CommonHelper.GetRandomList(size);
long min = long.MaxValue;
long max = 0;
long sum = 0;
foreach (var i in list)
{
m_stopwatch.Reset();
m_stopwatch.Start();
list.Contains(i); // list.IndexOf(i);
m_stopwatch.Stop();
long ticks = m_stopwatch.ElapsedTicks;
if (ticks < min)
min = ticks;
if (ticks > max)
max = ticks;
sum += ticks;
}
long averageSum = sum / size;
Run Code Online (Sandbox Code Playgroud)
编辑2:
我编写了与IndexOf()相同的代码,它的工作速度比Contains()慢.
根据他们的 MSDN 条目,他们得出的确定相等性的方法略有不同。查看每个条目的“备注”:
List<T>.IndexOf
使用EqualityComparer<T>.Default
http://msdn.microsoft.com/en-us/library/e4w08k17.aspx
List<T>.Contains
使用IEquatable<T>.Equals
http://msdn.microsoft.com/en-us/library/bhkz42b3.aspx
即使他们最终调用相同的方法来确定平等(就像这里的情况一样),他们也会采取不同的路线来到达那里,所以这可能会“解释它”。
鉴于“4 倍差异”似乎并非实际情况,一些临时拳击可能会造成一些差异,特别是对于 150k 大小的数据集
归档时间: |
|
查看次数: |
2129 次 |
最近记录: |