これはプログラミング言語固有のものではありません。
プロセスが完了するのに必要な時間をどのように推定できるかを理解する必要がありますか? たとえば、ファイルを解凍したり、CD を焼いたりしますか? この計算の精度を高める要因は何ですか?
もちろん、プログラミング言語のいくつかの例が役に立ちます。
プロセスの完了に必要な時間を単純に見積もることができない場合があります。この時間を見積もるためにあらゆる種類のスキームを考え出すことができますが、それを間違えると、進行状況バーが最後まで実行され、そこに留まる危険性があります。これはユーザーをイライラさせるだけです。
このような場合、利用可能な多くの GUI 要素の 1 つを選択して、アプリがユーザーのために作業を行っていることをユーザーに保証するのが最善です。
実際にかかった時間と関連する要因を記録します。同様の状況での過去の実行の平均に基づいて、将来の時間を推定します。ほとんどの場合、それほど正確になることはありませんが、何もしないよりはましだと思います。
あなたが言うように、これは言語固有ではありませんが、非常に状況固有です。ディスクの書き込みに関連する要因は、ファイルの解凍時間に影響を与える要因とはおそらく異なります。
正確で「適切な」見積もりが必要な場合は、おそらくあらゆる種類の精巧で派手なものを行うことができます。これを行う必要があるのは、プログラムの実行中に軽食を取りに行くべきか、そこに座って待つべきかを決定できるようにするためだけです。したがって、タスクが数秒 (待つ)、数分 (スナックやコーヒーを買う)、数時間 (ランチの時間!)、または数日 (これを少し最適化する必要があるかもしれません) かかるかどうかについて、非常に大まかなアイデアを得ることができれば十分です.. .)。
時間のかかるコードのほとんどは、多くの反復を伴う for ループになる傾向があります。だから、何回反復したか、何回やったか、どれくらいの時間がかかったかを見るだけです。ここで重要な決定を下す必要があります。それは次のいずれかです。
1) 反復を完了するまでの時間は、反復のインデックスと有意な相関はありませんt_remaining = (t_elapsed / finished_iterations)*remaining_iterations
。
2) インデックスは、反復あたりの時間に関連しています (最大値を見つけて配列 b に追加し、a からその要素を削除して、繰り返すことで配列 a をソートすることを想像してみてください。 )。この場合、 (I've never done to yet) を使用しt_remaining = t_last_iteration*remaining_iterations
ます。
ループの終了条件と現在の反復をパラメーターとして使用して、 for ブロックの最後で呼び出す、すばやく汚い Matlab 関数があります。ループの何パーセントが完了したか、およびおそらくあとどれくらいかかるかに関する情報を出力します (上記の方法 1 を使用):
function Progress(now, final)
% Call at inside a time-intensive for-loop with the current i (or other
% counter) in now and the final bound of the loop in final. This function
% will decide whether the rounded percentage has increased, and if it has,
% print progress information to the console.
%
% This expects loops to start at 1 and go up. Transform your variables
% accordingly if that is not the case - if the first time you call this
% function, the first argument isn't 1, you're in trouble.
%
% The aim of this function is to provide feedback on the progress of the
% loop, while making sure exactly 100 lines are printed, regardless of the
% number of iterations in the loop.
if now == 1
tic;
end
t_elapsed = toc;
nowPercent = round(100 * now / final);
oldPercent = round(100 * (now - 1) / final);
% Calculation rate = (total iterations so far)/(total time passed so far)
if nowPercent > oldPercent
t_remaining = round((t_elapsed / now * (final - now)) / 6) / 10;
disp([num2str(nowPercent) '% complete, estimated ' ...
num2str(t_remaining) ' minutes remaining...']);
end
end
私の意見では、Matlab コードは一目瞭然です。少し目立たないこと:tic
ストップウォッチを開始しtoc
、最後の からの経過時間を返しますtic
。
次のように使用します。
n = size(inputs);
for i = 1:n
do_complicated_calculation(inputs(i));
Progress(i, n);
end
多くの欠点がありますが、それらは明らかです。
時間の見積もりについてはあまり行っていませんが、考慮すべきだと思うことは言えます。
アルゴリズムの時間の複雑さ: O(n*n) アルゴリズムは、O(n) アルゴリズムの n 倍の時間がかかります。ほとんどの場合、見積もり対象の実装の詳細を知る必要があります。プログラムの推定時間は、実行中のコンピューターのクロック速度、ハードドライブの速度、メモリのクロック速度、インターネットの速度、およびディスク書き込みの場合はディスク ドライブの速度に比例します。ユーザーのコンピューターが光速に近い速度で移動している場合、特殊相対性理論などを考慮する必要がありますが、そうでないことを願っています。これらのほとんどは急速に変化する可能性があり、最初に見積もりを取得するのが難しいものもあります。プログラムにかかる実際の時間には、非常に多くの要因が関係しています。たとえば、他のプログラムはあなたのプログラムを遅くするかもしれません。
申し訳ありませんが、これに沿って物事をよりよく示すコード例は思いつきません。これが役立つことを願っています。
何をするにしても、決していっぱいにならない指数関数的に増加するプログレス バーを作成することによって、Windows エクスプローラーのようにごまかさないようにしてください。