16

ソフトウェアで非現実的な見積もりを出すプログレスバーや時間の見積もりが好きではないのは私だけではないことを私は知っています。最良の例は、10秒で0%から90%にジャンプし、最後の10%を完了するのに1時間かかるインストーラーです。

ほとんどの場合、プログラマーはタスクを完了するためのステップを見積もり、現在のステップ/合計ステップをパーセンテージで表示します。各ステップの完了には異なる時間がかかる可能性があるという事実を無視します。たとえば、データベースに行を挿入する場合、挿入時間は挿入された行の数に応じて長くなる可能性があります(簡単な例)。または、ファイルをコピーする時間は、ファイルのサイズだけでなく、ディスクとそれがどれほど断片化されているか。

今日、私は誰かがすでにこれをモデル化しようとしていて、おそらく構成可能なロバスト推定器を備えたライブラリを作成したかどうかを自問しました。外部要因(ネットワーク接続、ユーザーが他のプログラムを実行するなど)がその役割を果たすため、確実な見積もりを出すことは難しいことを私は知っています。

プロファイリングを使用してより適切な推定量を設定するソリューションもあるかもしれません。あるいは、機械学習アプローチを使用することもできます。

この問題の高度な解決策を知っている人はいますか?


これに関連して、プログレスバーの再考という記事が非常に興味深いものであることがわかりました。プログレスバーが時間の認識をどのように変えることができるか、そしてそれらの洞察を使用してより速いように見えるプログレスバーを作成する方法を示しています。


編集:時間の見積もりを手動で調整する方法を考えることができます。「推定ライブラリ」を使用しても、アルゴリズムを微調整する必要があります。しかし、この問題は統計ツールで対処できると思います。もちろん、見積もり担当者はプロセス中にデータを収集して、次のステップのためのより適切な見積もりを作成します。

私が今していることは、前のステップ(タイプごとにグループ化され、ファイルサイズ、トランザクションのサイズなどで正規化されたステップ)でかかった平均時間を取り、この平均を次のステップの見積もりとして取ります(ここでも、さまざまなタイプでカウントし、サイズ)。

今、私は推定量を作成するためのより良い統計ツールがあることを知っています、そして誰かがそれらを問​​題に適用したかどうか疑問に思います。

4

7 に答える 7

8

学部生のときに、ジュリアン・ミシグと私は、ハリソンらと同じように実験を行いました。紙。クラスのプロジェクトで予想されるように、5 秒間の間隔を除いて、プログレス バーが実際には短いと認識されなかったことを除いて、強力な主張を行うのに十分なデータは得られませんでした。

そのため、タスクにかかる時間が 10 秒より短い可能性が高い場合は、進行状況バーをまったく表示しないことをお勧めします。フィードバックを表示してはいけないというわけではありませんが、プログレス バーを表示すると、表示が遅くなる可能性があります。

興味のある方は、Julianのサイトに論文ポスターがあります。

于 2009-03-27T14:48:30.283 に答える
7

よろしくお願いします。私だけではありません。

見積もりを処理するライブラリはわかりませんが、プロファイリングのアイデアを個人的に保証することはできます。私はかつて、長くて複雑なファイル操作の進行状況を報告するために使用されるプログレスバーを実装しました(いくつかの小さなファイルが読み取られ、処理されてから、より大きなファイルに結合されていました)。ソフトウェアに読み取り、書き込み、処理にかかった時間を追跡させ、それに応じてプログレスバーを調整しました。プログラムが数回実行された後、プログレスバーはシルクのように滑らかに動きます。一時停止や速いブリップはありません。

これは、操作にかかる時間が簡単に測定できる限り機能します。ネットワークの速度は完全に不確定であるため、ダウンロードの進行状況インジケーターなどでこの方法を使用するのは気が進まないでしょう。

于 2009-03-27T13:58:29.577 に答える
4

問題は、「ステップ」の間違った定義が使用されることが多いため、ステップ数を見積もっていることではないと思います。インストーラーが 10 秒で 0 から 9% になり、残りは 1 時間になるというあなたの例では、プログラマーがバイト数ではなく、コピーするファイルの数を数えることにしたときにそれが起こるのを見てきました。

10 個のファイルがあり、そのうちの 9 個がそれぞれ 5K (readme、ライセンス、アイコンなど) で、最後の 1 個が 2Gig ISO だったとします。最初の 9 個は非常に高速にコピーされ、最後の 1 個は低速になります。ファイルのカウントはカウントするのが間違っていました。バイトをカウントする必要がありました。問題は、バイト数をカウントしたい場合、独自のコピー ルーチンを実装して、大きなファイルのコピー中にステータスの更新を提供できるようにする必要があることです。独自のコピー ルーチンを実装する価値はありますか?

もう 1 つの問題は、インストールが (他の多くのものと同様に) 非常に深いルーチンのスタックで構成されていることです。これらのルーチンは多くのことを行うことができますが、一般的なルーチンである可能性が高く、より高いレベルで進行状況メーターを更新できるものは何もありません。適切な進捗情報を取得するには、多くの一般的なルーチンを再実装する必要があります。

堅牢な推定器に関しては、それは本当に難しいと思います。特定の手順は構成ファイルで定義できますが、インストール プロセスのすべての部分から進行状況を更新する必要があります。さらに、これらのことを行う時間は明らかにマシンごとに異なるため、いずれにせよかなりずれている可能性があります。もちろん、特定のマシンへのインストールが完了したら、次回そのマシンへのインストールを見積もることができます。;-)

于 2009-03-27T14:04:36.927 に答える
2

あなたが言うように、あなたは100のステップを持っているかもしれませんが、それらのステップのそれぞれはそれらが何をするかに応じて異なる時間を要します。

1つのアプローチは、タスクを実行内容(削除、レジストリ値の変更、ダウンロード、ファイルのコピーなど)ごとにグループ化し、グループごとにいくつかの重要なプロパティを割り当てることです。

  • どの監視可能なメトリックが適用されますか(コピー速度、解凍速度など)?
  • そのプロセスの平均的な最悪の場合の割合はどれくらいですか?

次に、仕事全体で何をするかについてのリストを作成する必要があります。例:

  1. 100megファイルの解凍(グループ:解凍、値:100)
  2. 120メガバイトをコピーする(グループ:コピー、値:120)
  3. レジストリ値の設定(グループ:レジストリ、値:25)
  4. クリーンアップ(グループ:削除、値:100)

したがって、そこから、事前設定された平均最悪の場合の値に基づいて全体的な「推定」を計算できますが、精度の鍵は、システムが各タスクを実行できる速度を学習しながら、各メトリック乗数を更新することです。

Microsoftがそれを正しくするのに10年かかったので、最初はうまくいかなくてもあまり悩まないでください=)

于 2009-03-27T14:00:41.133 に答える
2

私はDREJを使用して、歴史的な進歩に対して非線形最小二乗回帰を行っています。それはかなりうまくいきます。

データベース テーブルを使用して履歴データを保存しています。テーブルの最後の 100 エントリに基づいて推定機能を再構築します。

レート決定変数を識別するための長期実行メソッドに関する注釈があります。

YMMV ですが、次回の見積もりではそれが考慮されます。

于 2009-11-25T23:18:55.003 に答える
2

もう 1 つの (そしてもっと簡単な方法) は、見積もりとユーザーの認識をパディングすることです。

ほとんどのプログレス バーは、継続時間の予測よりも UI の応答性のためにあります。ユーザーは、プログラムが停止していないことを確認するフィードバックを得る必要がありますが、完了時間についてはあまり気にしません。

タスクを待っていて、10 秒で 50% 完了した場合、最後の 50% を完了するのにさらに 20 秒かかるとイライラします。

同じタスクで、30 秒で 50% になり、60% まで進み、その後魔法のように 100% にジャンプする場合、私は驚きますが、イライラすることはありません。

タスクが非常に短い場合、または完全に予測できない場合は、いくつかのアニメーション ループも機能します (ブラウザの読み込みアイコン、iPhone の待機アニメーションなど)。

本当に精度が必要な場合は、バーの信頼性を高めるためにコードに時間を費やす価値があります。

于 2009-03-27T15:41:00.470 に答える