0

私はプログラミングのスキルを向上させようとしています。課題は間もなくリリースされます。それには、問題をできるだけ効率的かつ迅速に実行しながら解決することが含まれます。これがかなり抑制された/小さなコードであることは知っていますが、何かがあればそれをより速く実行するにはどうすればよいでしょうか。

このメソッドは、トランザクションの詳細を保持する配列を受け取ります。ループを維持するために使用されるトランザクションの数は 100 です。平均株数を取得してから返しています。流暢な英語ではないので、うまくいけば意味がわかります、ありがとう

double Analyser::averageVolume()
{
    // Your code
    double averageNumShares = 0;
    for(int i = 0; i < nTransactions; i++)
    {
        averageNumShares += tArray[i].numShares;
    }
    averageNumShares = averageNumShares / nTransactions;
    return averageNumShares;
    //return 0
}
4

6 に答える 6

4

n個の数値の平均を計算する必要がある場合、サンプルコードの線形時間アプローチをはるかに超えて高速化できないと思います..

これが別のより複雑なアルゴリズムの一部として使用され、これらの線に沿って平均などを計算する必要がなくなる可能性がある場合を除き、平均を取ることは、基本的にすべての合計を含む O(n) 操作になります。配列の要素と、要素数による 1 除算。これはまさにあなたが持っているものです。

于 2013-03-07T15:59:50.887 に答える
1

オブジェクトに他の 2 つの値 (現在の合計とアイテム数) を持たないのはなぜですか?

次に、平均を計算すると、それらの数値を利用できます。すばやく簡単に (インライン関数の可能性があります!)。

于 2013-03-07T16:04:45.090 に答える
0
int i= nTransactions;
while(i--){// test for 0 is faster
    averageNumShares += (q++)->numShares;// increment pointer is faster than offset
}
于 2013-03-07T16:24:30.593 に答える
0

gcc を使用する場合は、最適化のレベルを変更します。

于 2013-03-07T16:00:52.020 に答える
0

簡単な答え: このコードは、速度に関しては最高です。微調整できるのは、それをコンパイルする方法です。または明らかに、それがオプションである場合はアセンブリで書き直してください。

「引き延ばされた」回答: パフォーマンスを向上させたい場合は、コンパイラの最適化フラグと利用可能な最適化をすべて試しており、速度を上げるためにコードの可読性を犠牲にする準備ができている場合は、次のように書き直すことを検討できます。

for(int i = 0; i < nTransactions; i++)
    {
        averageNumShares += tArray[i].numShares;
    }

なので

pointerValue = &(tArray[0].numShares);
pointerIncrement = sizeof(tArray[0]);
for(int i = 0; i < nTransactions; i++)
    {
        averageNumShares += *(pointerValue++pointerIncrement);
    }

ループの反復ごとに固定オフセットを飛び越えるだけでよいことをコンパイラーに示すことで、パフォーマンスが向上する可能性があります。優れたコンパイラは、最初のコードでそれを確認できるはずです。また、新しいコードによってパフォーマンスが低下する可能性があります。それは実際にはコンパイラの仕様に依存します。繰り返しますが、コンパイラが提供できるものよりも優れたパフォーマンスを切望しており、インラインアセンブリまたは組み込み関数の使用にジャンプしたくない場合を除き、そのアプローチはお勧めしません (利用可能なもの)。

于 2013-03-07T16:02:07.163 に答える