我有一個應用程序執行一些代碼A的迭代次數,通常最多1M次迭代。 在代碼A執行之後,我收集諸如所花時間,錯誤消息等信息,如果異常被拋出等,則可以使用特定對象ExecutionInfo。然後,我將這個ExecutionInfo實例添加到一個ConcurrentBag中(從不知道ConcurrentBag,它可能是一個List,但需要是線程安全的)。彙總數據結果的最佳方式
經過1M次迭代後,我得到了100個ExecutionInfo實例的集合。下一步是總結一切,讓可以說ExecutionInfoAggregation,使用Linq擴展,如平均,最小值,最大值,計數爲各種有趣的數據。下面的代碼後1M迭代運行,並消耗CPU興田92%(說探查):
private void Summarize(IEnumerable<MethodExecutionResult> methodExecutions)
{
List<MethodExecutionResult> items = methodExecutions.ToList();
if (!items.Any())
{
return;
}
AvgMethodExecutionTime = Math.Round(items.Average(x => x.ExecutionTime.TotalMilliseconds),3);
MinMethodExecutionTime = Math.Round(items.Min(x => x.ExecutionTime.TotalMilliseconds),3);
MaxMethodExecutionTime = Math.Round(items.Max(x => x.ExecutionTime.TotalMilliseconds),3);
FailedExecutionsCount = items.Count(x => !x.Success);
}
順便說一句,應用程序的內存使用是「暴漲」。
這顯然不是高性能的。我的解決方案如下:
用更合適的替換集合類型,它允許快速插入和快速查詢。如果有的話,那會是什麼? 不要在1M次迭代後查詢集合,但在每次執行代碼後進行聚合。 試圖找到一種更緊湊的方式來存儲收集的數據。
任何想法如何優化查詢?有更好的方法嗎?
編輯:剛纔看到調用ToList()是沒有必要的