Performance 可以预测一个程序运行需要多长时间吗?

Performance 可以预测一个程序运行需要多长时间吗?,performance,algorithm,time,execution,Performance,Algorithm,Time,Execution,我在想,用一个任意的程序能做到这一点吗?我听说,通过一些数学知识,你可以估计一个简单的算法,比如排序算法,运行需要多长时间;但是更复杂的程序呢 有一次,我参观了一所大学的一个大型集群,它运行着来自世界各地科学家的项目。当我问其中一位工程师他们是如何安排每个程序何时运行的时候,他说,研究人员根据之前一些程序为此目的所做的分析,连同他们的程序一起发送了一份运行所需时间的估计 那么,这种程序真的存在吗?如果没有,我怎样才能很好地估计程序的运行时间呢?你真的不能 对于一个简单的算法,你知道某物是O(n)

我在想,用一个任意的程序能做到这一点吗?我听说,通过一些数学知识,你可以估计一个简单的算法,比如排序算法,运行需要多长时间;但是更复杂的程序呢

有一次,我参观了一所大学的一个大型集群,它运行着来自世界各地科学家的项目。当我问其中一位工程师他们是如何安排每个程序何时运行的时候,他说,研究人员根据之前一些程序为此目的所做的分析,连同他们的程序一起发送了一份运行所需时间的估计

那么,这种程序真的存在吗?如果没有,我怎样才能很好地估计程序的运行时间呢?

你真的不能

对于一个简单的算法,你知道某物是O(n)还是O(n^2)。你可以猜出它是哪一个

然而,如果你有一个运行大量不同算法的程序,那么很难对它进行估计。然而,您可以做的是根据上一次运行预测结果

假设您首先估计程序运行一小时,但它运行半小时。如果您在构建/发布之间的更改很少,那么下次您将知道它将在大约半小时的时间内运行


如果你做了根本性的改变,那么就很难找到ETA:-]

一般来说,你不能这样做,因为一般来说,你无法证明一个程序会完成。这就是所谓的

你应该研究大O符号。虽然它没有给出一个固定的数字,但它告诉您它的性能将如何随着不同的尺寸而变化。这里有一些简单的规则(如果您的代码在一个由n次迭代组成的循环中,那么运行该循环需要n*个时间)

问题在于:

对于复杂的程序,有多个变量影响它

不考虑用户交互

网络延迟等也一样


因此,这种方法适用于科学程序,程序是重微积分,使用的是经过研究的算法(很多时候,它只是在不同的数据集上运行相同的算法)。

实际上,你同时问了几个相关的问题,而不是一个问题

是否有一个程序a,当提供另一个任意的程序B作为输入时,提供程序B运行所需时间的估计值?不,绝对不是。你甚至不能设计一个程序a来告诉你一个任意的程序B是否会停止

第二个版本——程序B将永远停止——被称为停止问题,非常聪明,它被证明是不可判定的。维基百科有一个很好的网页,Goedel,Escher,Bach这本书是一本很长的,但非常对话和可读的关于Goedel的不完全性定理的论述,这与Goedel的不完全性定理密切相关

如果这是真的,那么科学家们是如何做出这些估计的呢?嗯,他们没有任意的程序,他们有自己编写的特定程序一些程序是不可判定的,但并非**所有*程序都是不可判定的。因此,除非有人犯了严重错误,否则科学家们不会尝试运行一个他们没有证明会停止的程序

一旦他们证明某些程序将停止,其中一个主要的数学工具就是大O符号。在非常直观的层面上,大O表示法有助于开发程序运行时如何随输入大小变化的缩放定律。在一个非常简单的例子中,假设您的程序是一个循环,并且循环需要一个任意的时间单位来运行。如果运行循环N次,则需要N个时间单位。但是,如果这个循环本身在另一个运行N次的循环中,那么整个过程需要N*N个时间单位。这两个项目的规模非常不同。(这是一个微不足道的例子,但真实的例子可能会变得相当复杂。)


这是一个相当抽象的数学工具。大O分析通常是如此抽象,以至于它们简单地假设所有足够低级别的操作都需要“大约”相同的时间,而大O并没有给出秒、小时或天的答案。实际上,真正的计算机还受到硬件细节的影响,例如执行一些非常低级的操作需要多长时间,或者更糟糕的是,将信息从机器的一个部分移动到另一个部分需要多长时间,这在多处理器计算机上非常重要。因此,在实践中,从大O分析中得出的见解与它将运行的机器的详细知识相结合,从而得出一个估计值

我这样问是因为有时候我根本不知道我的程序到底需要5分钟、1小时还是1个月才能结束。。。当然,这也是因为它非常有趣:-p基于对必须连续完成的操作以及每个操作的运行时间的了解,您可以估计总体运行时间。就自动化过程而言,计算机科学的早期证据之一是什么,你甚至不能确定它是否会完成,更不用说需要多长时间。你是说在一系列输入上?这是JerryCoffin定理的一个子集,该定理是关于一般程序的,而不是关于特定程序的。这意味着,对于许多程序,你可以证明它在什么时候结束,但对于一些程序,你不能。只要你测试一个“坏”程序,一切都很好:-)@SJuan76:是的,但他的第一句话是:“我想知道,用一个任意的程序能做到这一点吗?”非常有趣!我不知道。