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