首先,对不起我的英语,这不是我的主要语言。其次,我会尽力解释自己,但如果不清楚我可以提供任何细节。我有点没经验,让我们开始。
我有一个很大的foreach循环,有39k个元素。
foreach (Busqueda.CodDesCIE elemResult in result.listaCodDesCIE)
{
timer.Restart();
elemResultExterno = new getCodBusquedaResponse.ResultadoBusquedaResponse(elemResult.IdBuzon_Detalle, elemResult.Orden, elemResult.TipoAcierto, elemResult.ObjCIE10.Codigo, elemResult.ObjCIE10.Deslarga, elemResult.Cie10Adic1, elemResult.Cie10Adic2);
listaResult.Add(elemResultExterno);
param += " IdBuzon_Detalle:" + elemResultExterno.IdBuzonDetalle + " Orden:" + elemResultExterno.Orden + " TipoAcierto:" + elemResultExterno.TipoAcierto + " Codigo:" + elemResultExterno.Codigo + " Descripcion:" + elemResultExterno.Descripcion + " CodAdic1:" + elemResultExterno.CodAdic1 + " CodAdic2:" + elemResult.Cie10Adic2 + "\r\n";
timer.Stop();
Logger.Current.InfoLog("timerPartial: " + timer.ElapsedMilliseconds.ToString(), "itemNumber", orden.ToString());
orden++;
}
new getCodBusquedaResponse.ResultadoBusquedaResponse()
问题在于,对于第一个... 6k或更多元素,每次迭代花费不到0ms,但迭代时间在该点开始增长,在最后的迭代中达到5ms。偶尔,我也会看到一些偷看(dunno,如果你这样称呼它,“hight points”),迭代可能需要80ms或100ms。
我想知道,为什么时间在不断增长,如果是正常的话,是否容易避免......以及对如何优化此代码的一些帮助/解释。
日志:时间以毫秒为单位
[INFO] - itemNumber.2() - timerPartial: 0
[INFO] - itemNumber.7666() - timerPartial: 0
[INFO] - itemNumber.7667() - timerPartial: 1
[INFO] - itemNumber.7725() - timerPartial: 81
[INFO] - itemNumber.23579() - timerPartial: 3
[INFO] - itemNumber.24356() - timerPartial: 101
[INFO] - itemNumber.28144() - timerPartial: 5
[INFO] - itemNumber.29201() - timerPartial: 6
[INFO] - itemNumber.33997() - timerPartial: 5
[INFO] - itemNumber.33998() - timerPartial: 6
[INFO] - itemNumber.38547() - timerPartial: 80
foreachLoop.() - timerTotal: 239389
非常感谢提前。
编辑:List<getCodBusquedaResponse.ResultadoBusquedaResponse> listaResult
EDIT2:你们中的许多人似乎都指出了paramString。这段代码不是100%我的,所以不确定是否真的需要,会尝试你的一些建议,甚至评论该行并给出一些反馈,谢谢。
EDIT3:哇。编辑了字符串行:foreachLoop。() - timerTotal:20343
不知道这个问题。现在,这将成为现实。肯定会尝试CarbineCoder的建议和Eiver。如果这也有帮助,那么很好,任何时候我都可以保存。
非常感谢。
答案 0 :(得分:4)
我注意到的一件坏事是你要附加param
字符串变量。这将在循环中创建大量丢弃对象。而是使用字符串构建器。
StringBuilder builder = new StringBuilder()
foreach (Busqueda.CodDesCIE elemResult in result.listaCodDesCIE)
{
..
builder.Append(" IdBuzon_Detalle:").Append( elemResultExterno.IdBuzonDetalle);//etc.....
}
param = builder.ToString();
答案 1 :(得分:1)
CarbineCoder答案是一个明显的优化。
另一个是:
var listaResult= new List<getCodBusquedaResponse.ResultadoBusquedaResponse>(YOUR_EXPECTED_CAPACITY);
试试这些。 如果他们不工作。更新您的问题,使其不包含我们未知的方法。