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

Average はO(n)操作であるため、C# 内で最適化するためにできることはおそらくあまりありません。次の方法で並列化を試すことができます。

values.AsParallel().Average();

ただし、並列化のオーバーヘッドは、複数のスレッドを同時に実行する利点よりも大きい場合があります。

他の唯一の最適化は、count測定を への呼び出しに置き換えることvalues.Count()です。基礎となるデータ構造がListまたはであるArray場合は、計算時間を少し節約できます。 Count()O(1)

いずれにせよ、真の答えを得る唯一の方法は、それを測定することです。それぞれの方法を試して、どちらが速いかを確認してください。可能であれば、異なるシステム アーキテクチャでも試して、複数のコアやより多くのメモリなどの利点を確認してください。

于 2013-02-21T16:42:31.347 に答える
0

または、LINQ .Average() を使用できませんか?

于 2013-02-21T16:32:24.750 に答える