最適なパフォーマンスを得るには、おそらくリストではなく long の配列を使用できます。
ある時点で、ダウンロード時間推定器を実装するために同様の要件があり、最後の 1N
秒間の速度を格納するために循環バッファーを使用しました。
全体のダウンロード速度には関心がありませんでした。最近のアクティビティに基づいて予想されるおおよその時間でしたが、数値がいたるところで跳ね上がるほど最近ではありませんでした (それを計算する最後の秒)。
時間枠全体に関心がなかった理由は、ダウンロードが 30 分で 1M/s になり、次の 10 分間で 10M/s に切り替わる可能性があるためです。最初の 30 分間は、ダウンロードが非常に高速であるにもかかわらず、平均速度が大幅に低下します。
各セルが 1 秒間にダウンロードされる量を保持する循環バッファーを作成しました。循環バッファーのサイズは 300 で、5 分間の履歴データを許容し、すべてのセルはゼロに初期化されました。あなたの場合、必要なセルは 10 個だけです。
また、合計 (バッファー内のすべてのエントリの合計なので、最初はゼロ) とカウント (最初は明らかにゼロ) も維持しました。
毎秒、最後の 1 秒以降にダウンロードされたデータの量を把握し、次のようにします。
- 合計から現在のセルを減算します。
- 現在の数値をそのセルに入れ、セル ポインターを進めます。
- その現在の数字を合計に追加します。
- まだ 300 になっていない場合は、カウントを増やします。
- 合計/カウントに基づいて、ユーザーに表示される数値を更新します。
基本的に、疑似コードで:
def init (sz):
buffer = new int[sz]
for i = 0 to sz - 1:
buffer[i] = 0
total = 0
count = 0
index = 0
maxsz = sz
def update (kbps):
total = total - buffer[index] + kbps # Adjust sum based on deleted/inserted values.
buffer[index] = kbps # Insert new value.
index = (index + 1) % maxsz # Update pointer.
if count < maxsz: # Update count.
count = count + 1
return total / count # Return average.
これは、独自の要件に簡単に適応できるはずです。合計は、情報を「キャッシュ」する優れた機能であり、コードをさらに高速化する可能性があります。つまり、合計または平均を計算する必要がある場合は、データが変化したときにのみ、必要最小限の計算を使用して計算できます。
別の方法は、要求されたときに 10 個の数値すべてを合計する関数で、別の値をバッファーにロードするときに単一の減算/加算よりも遅くなります。