0

我尝试使用 ILSpy 查看System.Windows.Forms.DataVisualization.dll该函数System.Windows.Forms.DataVisualization.Charting.StatisticFormula.Mean(),但它似乎无法呈现内容。

我很好奇,这个函数在产生平均值方面是否比简单地编写我自己的平均值函数更有效,如下所示

   public static double Mean(this IEnumerable<double> values)
    {
        double sum = 0;
        int count = 0;

        foreach(double d in values)
        {
            sum += d;
            count++;
        }

        return sum / count;
    }

我很可能会与 300 万或更多的会员打交道。

[更新]

在测试期间,LINQIEnumerable.Average()在我的旧双核工作站上似乎非常高效,List<int>在 0.0011471 秒内处理了 87000 个成员。这比我想象的要高效得多:

var s3 = Stopwatch.StartNew();
double average1 = DaySampleValues.Average();
s3.Stop();
TimeSpan totaltime = s3.Elapsed; // = 0.0011471 seconds
4

2 回答 2

1

平均是一种O(n)操作,因此您可能无法在 C# 中对其进行优化。您可以尝试将其并行化:

values.AsParallel().Average();

但是并行化的开销可能超过同时运行多个线程的好处。

唯一的其他优化是将count测量替换为调用values.Count(). 如果底层数据结构是 a Listor Arraythen Count()will beO(1)并且可能会为您节省一些计算时间。

无论如何,获得真实答案的唯一方法就是对其进行测量。尝试每种方式,看看哪个更快。如果可能,请在不同的系统架构上尝试它们,以了解多核、更多内存等的好处。

于 2013-02-21T16:42:31.347 回答
0

还是不能使用 LINQ .Average()?

于 2013-02-21T16:32:24.750 回答