【问题标题】:How can we estimate the time needed for program to complete and reflect that to progress bar?我们如何估计程序完成所需的时间并将其反映到进度条上?
【发布时间】:2012-01-28 16:47:10
【问题描述】:

这不是特定于编程语言的。

我只需要了解如何估计完成流程所需的时间?例如解压缩文件或刻录 CD ?提高该计算精度的因素是什么?

任何编程语言的一些例子当然会有所帮助。

【问题讨论】:

    标签: progress concept


    【解决方案1】:

    有时您根本无法估计完成流程所需的时间。你可以想出各种方案来估计这个时间,但如果你弄错了,你就会冒着显示进度条的风险,该进度条一直运行到最后并坐在那里。这只会让用户感到沮丧。

    在这些情况下,最好从您可用的众多 GUI 元素中选择一种,以向用户保证您的应用正忙于为他们工作。

    【讨论】:

      【解决方案2】:

      记录实际花费的时间和相关因素;在类似情况下根据过去运行的平均值估计未来时间。在大多数情况下,它永远不会那么准确,但总比没有好。

      正如你所说,这不是特定于语言的,而是非常特定于情况的;与刻录光盘相关的因素可能与影响文件解压缩时间的因素不同。

      【讨论】:

        【解决方案3】:

        我在时间估算方面做得并不多,但我可以说出我认为应该考虑的因素。

        算法的时间复杂度:O(n*n) 算法将花费 n 倍于 O(n) 算法。您很可能需要了解您所估计的任何实施细节。您的程序的时间估计将与其运行的计算机的时钟速度、硬盘驱动器速度、内存时钟速度、互联网速度成正比,如果是光盘刻录,则与磁盘驱动器速度成正比。如果您的用户的计算机以接近光速的速度运行,您将不得不考虑狭义相对论之类的东西,但希望情况并非如此。其中大部分都可以迅速改变,而其他的则很难在一开始就得到估计。程序实际花费的时间确实涉及太多因素。例如,其他程序可能会减慢您的速度,我认为很难考虑到这一点。

        抱歉,我想不出任何代码示例可以更好地演示。我希望这会有所帮助。

        【讨论】:

          【解决方案4】:

          无论您做什么,请确保您不要像 Windows 资源管理器那样作弊,方法是创建一个永远不会填满的呈指数增长的进度条 - 这比选取框进度条更令人恼火。

          【讨论】:

            【解决方案5】:

            如果您想要一些精确的、“不错的”估计,您可能可以做各种精心设计和花哨的东西。我只需要这样做,以便我可以决定是否应该在程序运行时去吃点零食,或者是否应该坐在那里等待它。因此,我对任务是否需要几秒钟(等待)、几分钟(吃点心或咖啡)、几小时(午餐时间!)或几天(也许我应该稍微优化一下)有一个非常粗略的了解就足够了。 .).

            我的大部分时间密集型代码往往是具有多次迭代的 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
            

            它有很多缺点,但也很明显。

            【讨论】:

              猜你喜欢
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 1970-01-01
              • 2013-03-05
              • 1970-01-01
              • 2010-10-15
              • 1970-01-01
              • 1970-01-01
              相关资源
              最近更新 更多