C# 总结数据结果的最佳方法

C# 总结数据结果的最佳方法,c#,performance,linq,C#,Performance,Linq,我有一个应用程序,可以多次执行一些代码,通常最多可以执行100万次迭代。 在代码A执行之后,我在一个专门的对象(比如ExecutionInfo)中收集信息,比如所用的时间、错误消息、是否引发了异常等。然后,我将ExecutionInfo的实例添加到ConcurrentBag中(不管ConcurrentBag如何,它也可以是一个列表,但需要是线程安全的) 经过1百万次迭代后,我得到了1百万个ExecutionInfo实例的集合。下一步是使用Linq扩展(如Average、Min、Max、Count

我有一个应用程序,可以多次执行一些代码,通常最多可以执行100万次迭代。 在代码A执行之后,我在一个专门的对象(比如ExecutionInfo)中收集信息,比如所用的时间、错误消息、是否引发了异常等。然后,我将ExecutionInfo的实例添加到ConcurrentBag中(不管ConcurrentBag如何,它也可以是一个列表,但需要是线程安全的)

经过1百万次迭代后,我得到了1百万个ExecutionInfo实例的集合。下一步是使用Linq扩展(如Average、Min、Max、Count)将所有内容汇总到ExecutionInfoAggregation中,用于各种有趣的数据。以下代码在1百万次迭代后运行,并消耗92%的hte CPU(探查器说):

private void summary(IEnumerable方法执行)
{
List items=methodExecutions.ToList();
如果(!items.Any())
{
返回;
}  
AvgMethodExecutionTime=Math.Round(items.Average(x=>x.ExecutionTime.total毫秒),3);
MinMethodExecutionTime=Math.Round(items.Min(x=>x.ExecutionTime.TotalMillimes),3);
MaxMethodExecutionTime=Math.Round(items.Max(x=>x.ExecutionTime.TotalMillistics),3);
FailedExecutionCount=items.Count(x=>!x.Success);
}
顺便说一句,应用程序的mem使用率正在“飞涨”

这显然根本就没有表现。我的解决办法如下:

用更合适的集合类型替换集合类型,该集合类型允许快速插入和快速查询。如果有的话,那会是什么? 不要在1M迭代后查询集合,而是在每次代码执行后进行聚合。 尝试找到一种更紧凑的方式来存储收集的数据

有没有办法优化查询?有更好的方法吗


编辑:刚才看到对ToList()的调用是不必要的

而不是保存关于每次执行的信息,我会在每次方法执行后聚合它们

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;
    }
}
公共类方法执行
{
私有整数_excCount=0;
私有Int64_totalExcTime=0;
private int_excmaxtimetotal毫秒=0;
私有整数_excmintimotalMillSeconds=int.MaxValue;
专用int_故障计数=0;
公共无效添加(int excTime,bool isFail)
{
_excCount+=1;
_总excTime+=excTime;
如果(excTime>\u EXCMaxTimeTotal毫秒)
_EXCMaxTimeTotal毫秒=excTime;
如果(EXCTIMENT<\u EXCMINTIMETOMOTALM毫秒)
_EXCMINTIMETALMILLESCENS=EXCTTIME;
如果(isFail)
_故障计数++;
}
公共无效汇总(out int avgTime、out int minTime、out int maxTime、out int failCount)
{
avgTime=(int)数学四舍五入((double)\u totalextime/\u excount);
minTime=_exMinTimeTotalMills;
maxTime=_EXCMaxTimeTotal毫秒;
故障计数=_故障计数;
}
}
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;
    }
}