基于属性迭代和设置计数器的快速方法
本文关键字:计数器 设置 方法 迭代 于属性 属性 | 更新日期: 2023-09-27 17:58:47
我想遍历一个具有一些典型属性的自定义类的列表。该列表将是巨大的,并不断增长(从3000件开始,可能达到+10000件)
我正在阅读有关快速迭代和检查属性的最佳方法,因为我将填充一些计数器。
在.NET中,哪个循环运行得更快,';对于';或者';foreach';?
http://www.codearsenal.net/2013/12/csharp-multithreading-loop-parallel-for.html#.U09-qPl_vA0
但如果我需要遵循逻辑来检查这些属性。。。什么会更快?
目前我的代码如下:
public void CalculateTotalCounters()
{
#region ParallelCounting
countTotal = 0;
countMapped = 0;
countNotMapped = 0;
countError = 0;
errorFound = false;
MyList.AsParallel().ForAll(acc =>
{
lock (this)
++countTotal;
if (!string.IsNullOrEmpty(acc.isMapped))
{
lock (this)
++countMapped;
}
if (string.IsNullOrEmpty(acc.isMapped))
{
lock (this)
++countNotMapped;
}
if (acc.HasError || acc.NotUnique || acc.DefalutName || acc.DefaultValue)
{
lock (this)
{
++countError;
errorFound = true;
}
}
});
#endregion
}
我知道isMapped的两个条件可能只在一个条件下,否则(这会影响锁定吗?)
谢谢。
锁将扼杀从并行中获得的性能。
可以使用互锁增量http://msdn.microsoft.com/en-us/library/dd78zt0c(v=vs.110).aspx
Interlocked.Increment(countMapped)
而且你不需要数那么多东西。循环后,你可以计算一些:
countTotal = MyList.Count();
countNotMapped = countTotal - countMapped;
errorFound = errorCount > 0;
但无论你做什么,你都应该对此进行评测,即Time-it。你可以为此使用Stopwatch类。然后你可以尝试不同的方法,看看哪个更快。
然后你应该试试这些:
countMapped = MyList.Count(acc => istring.IsNullOrEmpty(acc.isMapped);
countMapped = MyList.AsParallel().Count(acc => istring.IsNullOrEmpty(acc.isMapped);