プログレスバーを表示すると、完了時間が遅くなります
チームのタスクを自動化する内部スクリプトをたくさん書いています。スクリプトが「停止」したかどうか疑問に思わないようにするために、長時間実行されるタスクの簡単な進行状況バーを表示します。これを行うのは、実行前に完了が必要な量がわかっているので、完了した量を測定できるためです。実行される操作の数を節約するために、進行状況バーは毎秒n
、またはタスクが起動/完了したときにのみ更新します。
私が見つけたのは、次の間にトレードオフがあるということです。
- ユーザーエクスペリエンス(タスクが実行されていることを知っている)
- スクリプト全体の完了時間
ステップを追加してプログレスバーを作成し、それらを認識し続けることで、タスクに2倍の時間がかかる可能性があります。
一般に、これは予想されるトレードオフですか(おそらく他の言語ではなく、Pythonで)?
回答
それはとてもいい質問です。
一般的に、私たちは常にユーザーエクスペリエンスを優先します。
例:フライト検索エンジンは結果を即座に配信できますが、ユーザーが徹底的な検索を行った方が安全だと感じるため、読み込みに時間がかかります。
2倍遅くなると。2xは、数秒であればおそらく問題ありませんが、何年もかかる場合は恐らくひどいものです。それはすべて、ユーザーのコンテキストによって異なります。あなたのサイトが生死にかかわる仕事の種類であるなら、速い方が良いです、あなたのユーザーがそれがかかる時間でもっとリラックスしていて、いつチェックするかを知って、彼らに予想される時間を伝えることがより重要であるなら最良の選択肢。
ときに速くする
- 読み込み時間は、採用、使用、信頼性、信頼などに悪影響を与えることが証明されています。
- スピードは生死の問題です
- スピードはお金を稼ぐことの問題です(例えば、電話のクライアントは緊急の回答が必要です)
次の場合に読み込みバーを表示する
- 時間を2倍しても、ユーザーを完全に遠ざけるような時間にはなりません。
- あなたのユーザーはおそらく何か他のことをしている間待つ余裕があります
考慮すべきその他の事項多分、いくつかのプロセスではローディングバーを取得し、一部では取得しないハイブリッドソリューションが必要です。
おそらく、別のオプションが必要です。たとえば、読み込みバーを表示し、それを非表示にすることでタスクを高速化できることをユーザーに伝えたり、タスクの準備ができたときにメール通知を受信するかどうかをユーザーに尋ねたりします。
いずれにせよ、最良のアイデアは、ユーザーがコンテキストとニーズに応じて何を好むかを確認することです。
それでも頑張ってください、それは非常に興味深い挑戦です。最終的にどの決定を選んだかをポストバックしてください。:)
自明なことに、アクションを実行し、進行状況バーを表示しているプログラム(つまり、2つのアクション)は、1つのアクションのみを実行しているプログラムよりも多くのCPUを使用します。
ただし、これは必ずしも実時間で遅くする必要があるという意味ではありません。実際、2倍のスローダウンimhoはやり過ぎのようです。
いくつかの戦略が含まれます:
- プログレスバーが表示されない(whisは実際にはほとんどのUnixコマンドのデフォルトであり、詳細オプションを追加する必要があります)
- プログレスバーを無効にする静かなオプションを提供します。これは実際にはUIに提供する必要があります(たとえば、ユーザーがcronから実行したり、出力をファイルにリダイレクトしたりする場合)が、プログレスバーの速度低下を回避するという副作用があります。
- 別のスレッドで進行状況を表示します。Pythonで実行するにはおそらく複雑ですが、他の言語では通常です。進捗状況を示すGUIスレッドと、実際の作業を実行するワーカースレッドがあります。
- プログレスバーの更新間隔/ステップサイズを減らす。
- ファイルをバイトごとにコピーする場合(引数のために、これは明らかに非効率的です)、プログレスバーをバイトごとに再描画するのではなく、MBがコピーされるたびにのみ更新することをお勧めします。
- または、X秒ごとにステータスを更新するタイマーを設定するなどの時間によって(ここでも、できればメインアクションと非同期に、または別のスレッドで)。
- プログレスバーをできるだけ安くする。これは、本格的なプログレスバーではなくドットのみを出力することから、プログレスバーを「描画」し、各ステップで再度計算することを回避することまで可能です(ただし、SIGWINCHで完全な処理を実行する必要があります)。
一般に、これは予想されるトレードオフですか
一般的に、それを回避できるかどうかによると思います。インターネットから1つの大きなファイルをダウンロードする場合、ダウンロードにはさまざまなリソースが使用されるため、ほとんどの場合、適切なプログレスバーを使用できます。リモートの低速なファイルシステム(スマートフォンなど)からファイルをコピーする場合は、コピーする必要のあるすべてのディレクトリツリーを参照して、進行状況バーを表示することができます7。おそらくリソース(接続の帯域幅)が必要になります。電話で)ファイルが見つかって「表示どおりに」コピーされた場合はスキップできます。