どのように私は私の「残り推定時間」(およびETA)計算から「ジッター」を排除することができますか? -- c# フィールド と .net フィールド と progress フィールド 関連 問題

How can I eliminate the “jitter” from my “estimated time remaining” (and ETA) calculation?












8
vote

問題

日本語

私は12で、(例えば「5秒残り」)の計算を「推定時間が残っている」と、ショープログレスバーと「完了の推定時間」バックグラウンドタスクを実行している間(例えば、」完全なアプリケーションを持っています: 59:59" )、または私はそれを呼び出すよう、ETAます。

は、このETAを計算するアルゴリズムは、基本的に時間をかけて進行の「移動平均」を取ります。
1.各progressイベントは、現在の時刻でキューに追加されます。
2.一定時間(例えば10秒)後、アイテムが待ち行列から除去される。
3. ETAは、キュー内の最初と最後の項目から推定される。
あなたが気にしている場合、ソースコードが提供されています: ETACalculator.cs

しかし、<強い>ジッタの問題はあります。各プログレスイベントが計算に追加されるように、ETAはわずかに更新されます。のは、ETAが唯一の 0.1s のことで変化することとしましょう。この小さなジッタを簡単に「フラッター」にETAの原因となります。たとえば、代わりなど5S、4S、3S、よりスムーズな進行を見ての...、私は5-5-5-4-5-4-5-4-5-4-4-4を参照してください。 リアルタイムの

私はちょうど1秒当たりの更新を減らすことを考えていたが、その後、プログレスバーが少なくスムーズに、そしてまた、私は実際には「実際の」スローダウンのように示すことを思います。

私はこのびくびくジッターを低減単純なアルゴリズムを考え出すのトラブルを抱えています。どのように私は、ジッタを削除することができますか?
英語

I have an application that, while performing a background task, shows a progress bar with an "estimated time remaining" calculation (eg "5 seconds remaining") and a "estimated time of completion" (eg "complete at 12:59:59"), or as I call it, the ETA.

The algorithm for calculating this ETA basically takes the "rolling average" of progress over time:
1. Each progress event gets added to a queue with the current time.
2. After a certain duration (eg. 10s), items are removed from the queue.
3. The ETA is extrapolated from the first and last items in the queue.
The source code is available if you care: ETACalculator.cs

However, there's a jitter problem. As each progress event is added to the calculation, the ETA will be updated slightly. Let's say that the ETA changes by only 0.1s. This small jitter easily causes the ETA to "flutter". For example, instead of seeing a smooth progression from 5s, 4s, 3s, etc..., I see 5-5-5-4-5-4-5-4-5-4-4-4.

I was thinking of just reducing the updates to 1-per-second, but then the progress bar is less smooth, and also I'd really like "actual" slowdowns to be shown real time.

I'm having trouble coming up with a simple algorithm that reduces this jumpy jitter. How can I remove the jitter?

</div
        
         
         

回答リスト

11
 
vote
vote
ベストアンサー
 

実際のジッタリーの進行状況表示されているの2つの別の変数に分離します。

今すぐjitteryの進行状況を更新してください。

通常の(比較的速い)間隔で、表示されている進行状況をアプローチの実際の進歩を更新します。

簡単なアプローチアルゴリズムは、2つの値を平均することです

<事前> <コード> display_progress = (display_progress + actual_progress) / 2

これは、即値の値だけではなく、過去の値を反映するように値を減衰させます。

を使用して滑らかさを洗練することもできます。 <事前> <コード> display_progress = (P) * display_progress + (1.0-P) * actual_progress

ここで、 P は<コード> 0.0 と 1.0 の間の定数値です。

編集:

これは使用できる多くのフィルタの1つです。これはそれが多くの簿記を必要としないという点でうれしいです。

しかし、完璧な出力入力にあるため、オプションになることはありません。 「ジッタ」と「実際の減速」の違いは、の後に観察可能なです。

 

Separate the actual jittery progress and the displayed progress into two separate variables.

Update the jittery progress as you do now.

At a regular (relatively quick) interval, update the displayed progress to approach the actual progress.

A simple approach algorithm would be to average the two values

display_progress = (display_progress + actual_progress) / 2  

This will dampen the value to reflect past values and not just the immediate value.

You can also refine the smoothness by using:

display_progress = (P) * display_progress + (1.0-P) * actual_progress  

Where P is a constant value between 0.0 and 1.0.

Edit:

This is one of many filters that could be used. This one is nice in that it doesn't require much bookkeeping.

However, getting perfect output is not going to be an option, because the flaw is in your input. The difference between "jitter" and "actual slowdowns" is only observable after it has happened.

</div
 
 
   
   
3
 
vote

コードを見ることなくあなたのアルゴリズムにはまったく明確ではありませんが、あなたが最初に現在のETAをチェックし、新しい値が古い値より低い場合にのみ更新されるだけでそれを更新するだけで更新してください。

 

Not quite clear on your algorithm without seeing code, but when you update your ETA just first check the current ETA and only update it if the new value is lower than the old.

</div
 
 
 
 
0
 
vote

それはあなたが欲しいもののように聞こえます "Debounce":最後のx値の最低値を選択してください。

 

It sounds like what you want is to "debounce": choose the lowest value of the last X values.

</div
 
 
   
   

関連する質問

34  Androidの戻るボタンと進行状況ダイアログ  ( Android back button and progress dialog ) 
私は、作業しながらProgressDialogを示す asynctask を持っています( DoinBackground から RunonuithRead を呼び出して進行状況ダイアログ)。実行中は、戻るボタンを使用して操作をキャンセルしたいと思います。他の誰...

0  進捗状況によるマルチプロセッシング  ( Multiprocessing with progress ) 
基本的な質問をする場合は、 multiprocessing で働いたことがない。 この答え私のニーズに適応した非常に素晴らしい処理クラスを提供し、それは非常にうまく機能します。私は print ステートメントを使用してテストしている基本的な進捗バーを実装しよ...

2  PFImageView内でPFILDダウンロードの進行状況を表示する方法  ( How do i show the progress of a pffile download inside a pfimageview ) 
誰もがPFIMageViewの進捗ビューバーを設定する方法、つまり( parse.com からダウンロードする方法を知っていますか。 )?その方法についてチュートリアルが見つかりません。 (私はイメージをロードしてからアクティビティインジケータを設定したくあり...

0  進行状況ダイアログは却下されません  ( Progress dialog does not dismiss ) 
Location_Buttonと呼ばれるボタンをクリックしてから、自分の場所に関する情報を表示するボックスを表示した後、ユーザーの場所を取得することです。私はこのようにしました: <事前> <コード> Button location_Button=(Butt...

0  進行状況の表示方法フラッタの現在の画面にオーバーレイされたアニメーションを表示する方法は?  ( How to show a progress indicator animation overlayed on current screen in flutte ) 
現在の画面上のオーバーレイのロードインジケータをフラッタの上に表示する方法は? ユーザーがログインしようとしたとき、そしてHTTPリクエストを作成しようとしているときに、紡績インジケーターに調光なしで現在の画面コンテンツの上に表示したい場合、ダイアログを使用し...

4  iOSでの進捗報告を用いた非同期操作のキャンセル可能なセット  ( Cancellable set of asynchronous operations with progress reporting in ios ) 
他のSDK(Controlを有していない)を非同期的にインポートし、完了時に完了コールバックを呼び出すAPIを使用しているとします。 以下はAPIの例です。 <事前> <コード> func importFile(filePath: String, comple...

3  ループのための進行状況を示す  ( Showing progress during for loop ) 
進捗状況を表示したいFOREACHループがあります。 <事前> <コード> 1..254 | ForEach-Object {Test-Connection -ErrorAction SilentlyContinue -count 1 -TimeToLive...

3  長い実行プロセスで残りの時間をテキスト的に報告する正しい方法は?  ( Correct way to textually report the remaining time on a long running process ) 
だからあなたはおそらく進行状況バーを持つ長い実行プロセスを持っていて、あなたは残りの時間のテキスト推定値、例えば、 "5分の残りの残りの残りの残り"などを望みます。 実際には時計時間を報告したくない場合(正確性や解像度の問題や更新レートの問題により)がテキスト...

19  進行状況の代わりに進行中の円を望みます  ( I want a progress circle instead of progress dialog ) 
データのロード中に私のアプリの進行状況を表示したいです。私はアクティビティを持っていて、あるアクティビティから別のアクティビティから別のアクティビティに移動しています。XMLデータをいくつか解析しています。 ...

8  X時間の待機タスクと報告の進捗状況  ( Wait task for x amount of time and report progress ) 
スレッドSLEEPよりも寝ているタスクのためのより良いデザインが必要です、私はタスククラスを使っています。 私はタスクを実行します、このタスクは別のタスクを実行します。このタスクは、ログインした後、最初にログインしてインターネットのWebサイトとインターネット...




© 2022 cndgn.com All Rights Reserved. Q&Aハウス 全著作権所有