我想知道,用任意程序可以做到这一点吗?我听说,通过一些数学,你可以估计一个简单的算法,如排序算法,将运行多长时间;但是更复杂的程序呢?
有一次我访问了一所大学的大型集群,该集群运行来自世界各地科学家的程序。当我向其中一位工程师询问他们如何安排每个程序的运行时,他说研究人员根据先前对某些程序所做的分析,通过他们的程序发送了他们需要运行多长时间的估计。为了这个目的。
那么,这种程序真的存在吗?如果没有,我怎样才能很好地估计我的程序的运行时间?
答案 0 :(得分:7)
一般情况下你不能这样做,因为一般来说你无法证明一个程序会完成。这被称为halting problem
答案 1 :(得分:5)
你实际上是在同一时间提出一些相关的问题,而不仅仅是一个问题。
是否有程序A,当另一个任意程序B作为输入时,提供程序B运行需要多长时间的估计?不,绝对不是。您甚至无法设计一个程序A来告诉您任意程序B是否会停止。
第二个版本 - 程序B将停止 - 被称为停止问题,巧妙地,并且已经证明它不是可判定的。维基百科有一个很好的网页,而 Goedel,Escher,Bach 这本书是一个非常长的,但非常对话和可读的阐述,涉及Goedel的不完备性定理,这是非常密切相关的。
http://en.wikipedia.org/wiki/Halting_problem
http://en.wikipedia.org/wiki/G%C3%B6del,_Escher,_Bach
如果这是真的,那么科学家们如何得出这些估计?好吧,他们没有任意程序,他们有自己编写的特定程序。 一些程序是不可判定的,但不是**所有*程序都是不可判定的。因此,除非有人犯了严重错误,否则科学家们不会尝试运行他们尚未证实会停止的程序。
一旦他们证明某些程序将停止,其中一个主要的数学工具称为Big O表示法。在非常直观的层面上,Big O表示法有助于针对程序的运行时间如何随输入的大小而变化而制定缩放法则。在一个非常简单的例子中,假设你的程序是一个循环,循环需要一个任意的时间单位来运行。如果你运行循环N次,则需要N个单位的时间。但是,如果该循环本身在另一个运行N次的循环中,则整个过程需要N * N个时间单位。这两个项目的规模差别很大。 (这是一个微不足道的例子,但真实的例子会变得非常复杂。)
http://en.wikipedia.org/wiki/Big_oh
这是一个相当抽象的数学工具。大O分析通常是如此抽象,以至于他们只是假设所有足够低级别的操作都需要大约“大约”相同的时间,而Big O无论如何都不会在秒,小时或天数方面给出答案。在实践中,真正的计算机也受到硬件细节的影响,例如执行某些非常低级别的操作需要多长时间,或者更糟糕的是,将信息从机器的一个部分移动到另一个部分需要多长时间,这对于多处理器计算机。因此,在实践中,Big O分析的见解与对其运行的机器的详细知识相结合,以便得出估计值。
答案 2 :(得分:2)
你应该研究Big O符号。虽然它没有给出固定的数字,但它会告诉你它的性能如何随着不同的尺寸而变化。有一些简单的规则(如果你的代码是在n次迭代的循环中,那么运行循环需要n *时间。)
问题是:
对于复杂的程序,有多个变量影响它。
不考虑用户互动。
网络延迟等相同
因此,这种方法适用于科学程序,其中程序是重度计算,使用非常研究的算法(并且很多时候它只是在不同的数据集上运行相同的算法)。
答案 3 :(得分:0)
你真的不能。
对于一个简单的算法,你知道某些东西是O(n)还是O(n ^ 2)。您可以对此进行评估。
然而,如果你有一个运行大量不同算法的程序,那么它就很难对它进行评估。然而,你可以做什么。是根据之前的运行预测结果。如果你第一次估计yuor程序运行一小时。它运行了半个小时。并且你在te版本/发布版本之间的变化非常小,那么下次你将会知道它将在大约半小时内运行。
如果你做了彻底改变,那么找到ETA就变得更难了: - ]