2014-05-20 100 views
0

我有一個應用程序執行一些代碼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()是沒有必要的

回答

0

而不是保存有關每個執行信息每種方法執行後我會集結他們。

public class MethodExecutions 
{ 
    private int _excCount = 0; 
    private Int64 _totalExcTime = 0; 
    private int _excMaxTimeTotalMilliseconds = 0; 
    private int _excMinTimeTotalMilliseconds = int.MaxValue; 
    private int _failCount = 0; 

    public void Add(int excTime, bool isFail) 
    { 
     _excCount += 1; 
     _totalExcTime += excTime; 

     if (excTime > _excMaxTimeTotalMilliseconds) 
      _excMaxTimeTotalMilliseconds = excTime; 

     if (excTime < _excMinTimeTotalMilliseconds) 
      _excMinTimeTotalMilliseconds = excTime; 

     if (isFail) 
      _failCount++; 
    } 

    public void Summarize(out int avgTime, out int minTime, out int maxTime, out int failCount) 
    { 
     avgTime = (int) Math.Round((double) _totalExcTime/_excCount); 
     minTime = _excMinTimeTotalMilliseconds; 
     maxTime = _excMaxTimeTotalMilliseconds; 
     failCount = _failCount; 
    } 
}