( 这个问题是从这里开始的讨论 )
我比较定时为寻找一个true
的值List<bool>
使用List.Contains()
与那些用于手卷回路。
我看到那些其他人不同的结果。 我已经尝试过了几个系统,并循环似乎快了2和3.5倍之间的所有我已经试过它的系统。 这些系统的范围从与.net 4运行XP运行Windows 8和.NET 4.5最近的PC 5岁的笔记本电脑。
其他人都报告不同的结果,即List.Contains()
是差不多的速度,比稍快,循环。
这里是我的测试代码。
using System;
using System.Collections.Generic;
using System.Diagnostics;
namespace ConsoleApplication1
{
internal class Program
{
private static void Main()
{
int size = 10000000;
int count = 10;
List<bool> data = new List<bool>(size);
for (int i = 0; i < size; ++i)
data.Add(false);
var sw = new Stopwatch();
for (int trial = 0; trial < 5; ++trial)
{
sw.Restart();
for (int i = 0; i < count; ++i)
TestViaLoop(data);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds + " TestViaLoop()");
sw.Restart();
for (int i = 0; i < count; ++i)
TestViaListContains(data);
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds + " TestViaListContains()");
Console.WriteLine();
}
}
static bool TestViaLoop(List<bool> data)
{
for (int i = 0; i < data.Count; ++i)
if (data[i])
return true;
return false;
}
static bool TestViaListContains(List<bool> data)
{
return data.Contains(true);
}
}
}
为了测试此代码,你应该编译它作为一个x86发布版本,并从调试器外部运行它。
下面是使用.NET 4.5框架(虽然我与.NET 4中类似的结果)我的Windows 8的x64 PC我的结果:
Times are in milliseconds
126 TestViaLoop()
441 TestViaListContains()
122 TestViaLoop()
428 TestViaListContains()
131 TestViaLoop()
431 TestViaListContains()
138 TestViaLoop()
426 TestViaListContains()
122 TestViaLoop()
439 TestViaListContains()
正如你可以看到,环路采用1/3左右我的系统上的时间。
现在,如果我们使用Resharper
来看看执行List.Contains()
它看起来是这样的:
bool Contains(T item)
{
if (item == null)
{
for (int j = 0x0; j < this._size; j++)
{
if (this._items[j] == null)
{
return true;
}
}
return false;
}
EqualityComparer<T> comparer = EqualityComparer<T>.Default;
for (int i = 0x0; i < this._size; i++)
{
if (comparer.Equals(this._items[i], item))
{
return true;
}
}
return false;
}
尽管它是使用Comparer.Equals()
其中应使它比环路更慢)它也使用私有_items[]
阵列直接,这避免了将要被用于我的循环执行索引范围检查。
我有三个问题:
- 别人可以复制我看到的结果吗? (记住要运行调试器之外的发布版本。)
- 如果是这样,任何人可以解释我的循环怎么可以这么快于多
List.Contains()
- 如果没有,任何人都可以解释为什么我看到我的循环要快?
这不仅仅是学术上的兴趣给我的,因为我写的,与大量的数字数据,并且必须尽可能快的代码工作,这是诸如此类的事情,我需要知道。 (注意:是的,我个人资料的事情,只能尽量优化的东西,需要优化......我知道过早优化的问题。)
[编辑]
它发生,我认为这可能是处理器相关的。 所有我已经试过它的系统有英特尔处理器,虽然很不同的型号,从四核3.8GHz的处的奔腾M单核1.6 GHz的...
对于那些你们谁看到了循环运行的速度较慢,你在运行英特尔处理器?