这不是特定于编程语言的。
我只需要了解如何估计完成流程所需的时间?例如解压缩文件或刻录 CD ?提高该计算精度的因素是什么?
当然,任何编程语言中的一些示例都会有所帮助。
有时您根本无法估计完成一个过程所需的时间。你可以想出各种方案来估计这个时间,但如果你弄错了,你就会冒着显示进度条的风险,该进度条一直运行到最后并坐在那里。这只会让用户感到沮丧。
在这些情况下,最好选择您可用的众多 GUI 元素之一,以向用户保证您的应用程序正忙于为他们工作。
记录实际花费的时间和相关因素;在类似情况下根据过去运行的平均值估计未来时间。在大多数情况下,它永远不会那么准确,但我想它总比没有好。
正如您所说,这不是特定于语言的,而是特定于情况的;与刻录光盘相关的因素可能与影响解压缩文件时间的因素不同。
我在时间估算方面做得并不多,但我可以说我认为应该考虑的内容。
算法的时间复杂度: O(n*n) 算法将比 O(n) 算法花费 n 倍的时间。您很可能需要了解您所估计的任何实施细节。您的程序的时间估计将与其运行的计算机的时钟速度、硬盘驱动器速度、内存时钟速度、互联网速度成正比,如果是光盘刻录,则与磁盘驱动器速度成正比。如果您的用户的计算机以接近光速的速度运行,您将不得不考虑狭义相对论之类的东西,但希望情况并非如此。其中大部分都可以迅速改变,而其他的则很难在一开始就得到估计。程序实际花费的时间确实涉及太多因素。例如,其他程序可能会减慢您的速度,
抱歉,我想不出任何可以更好地展示事情的代码示例。我希望这会有所帮助。
无论您做什么,请确保您不会像 Windows 资源管理器那样作弊,方法是创建一个永远不会填满的呈指数增长的进度条——它比选取框进度条更令人恼火。
如果你想要一些精确的、“不错的”估计,你可能可以做各种精心设计和花哨的东西。我只需要这样做,以便我可以决定是否应该在程序运行时去吃点零食,或者我是否应该坐在那里等待它。因此,我对任务是否需要几秒钟(等待)、几分钟(吃点心或咖啡)、几小时(午餐时间!)或几天(也许我应该稍微优化一下)有一个非常粗略的了解就足够了。 .)。
我的大部分时间密集型代码往往是具有多次迭代的 for 循环。所以我只看有多少次迭代,我做了多少次,花了我多长时间。我有一个关键决定要做出,要么是:
1)完成迭代的时间与迭代的索引没有显着相关性,在这种情况下t_remaining = (t_elapsed / finished_iterations)*remaining_iterations
。
2)索引与每次迭代的时间有关(想象通过找到最大值并将其附加到数组 b 来对数组 a 进行排序,从 a 中删除该元素并重复 - 随着您的继续,找到最大值会越来越快)。在这种情况下,我会使用 (Ive never need to yet) t_remaining = t_last_iteration*remaining_iterations
。
我有一个快速而肮脏的 Matlab 函数,我在 for 块的末尾以循环的结束条件和当前迭代作为参数调用该函数。它打印有关循环完成的百分比以及可能需要多长时间的信息(使用上面的方法 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
它有很多缺点,但也很明显。