2016-12-17 8 views
0

私は、毎秒何百回も実行されるレンダリング機能を持っており、各フレームが描画する時間は何ミリ秒であるかを教えてくれます。サイズが大きくなるにつれてベクトルの平均を計算する

すべてのフレームの現在のレンダリング速度平均を計算する関数を作成しました。この関数は、すべての前のフレームを保持するためにstd :: vectorを使用します。

しかし、私がプログラムを実行するたびに、平均値を格納するベクトルは膨大になり、プログラムの速度を約10倍遅くするとともに、メモリの使用量が増加します(描画速度)。

アベレージ機能(私はC++初心者です注意してください):

double average(std::vector<double> input_vector) 
{ 
    double total = 0; 

     for(unsigned int i = 0; i < input_vector.size(); i++) 
     { 
      total += input_vector.at(i); 
     } 

    return (total/(double)input_vector.size()); 
} 

誰かが私はこの問題を解決する手助けすることはできますか?

は、算術演算の定義を考えると

+1

値ではなく、参照によってベクトルを渡します。 'double average(std :: vector &input_vector)' - このコードは、毎回ベクトル全体のコピーを作成しています。オイ。 –

+1

また、 'at'の代わりに' operator [] 'を使用してください。あるいは単に 'std :: accumulate'を直接使用してください。これはC++で自動的に並列化できます.17 btw。 (libstdC++でも、それはあなたが使っているものではありません。) –

+0

あなたのヒントをありがとう。私は間違いなくそれらを将来心に留めておくでしょう! – 0x22fe

答えて

3

意味ありがとう、あなたがランニングを再計算するために、nのすべての値を格納する必要はありませんsum(n)/count(n)であることを意味し、あなただけそうのように、現在のsumと現在のcountを必要とします:

double runningMean(double newValue) { 
    static double sum = 0; 
    static double count = 0; 

    count++; 
    sum += newValue; 

    return sum/count; 
} 

いいえvectorはまったく必要です。

関連する問題