我需要找到在不同输入上执行程序的总时间。程序读取一些数据并将其写入另一个文件。数据值和数据大小每次都不同。
我想知道所有数据大小需要多长时间。
算法是根据程序的总计时进行单次执行吗?
例如,如果我知道
for single execution
a.program - execution time 1.2sec
- its create file 100 kb file
我可以找出不同数据大小的n次执行需要多长时间?
答案 0 :(得分:8)
我不太明白你的问题,但我相信你所问的是如何在运行之前弄清楚程序的执行时间。
这与halting problem有关。停止问题是棘手的。
如果我误解你的问题,请道歉。
编辑:为了回应您的澄清,对于较小输入,运行时较大输入的extrapolating运行时没有通用算法。 Analysis of algorithms是非常棘手的事情。您可以使用启发式方法。例如,您可以在不同“大小”(例如,10,100,1000,10000)的输入上计算运行时间,并尝试将曲线拟合到函数“size” - >运行时。
答案 1 :(得分:4)
对此没有完美的算法,并且它将是高度可变的 - 第一次运行可能非常慢,但是第二次运行会快得多,因为来自磁盘的数据被缓存在内存中。
您可以使用各种输入来测量程序,并尝试构建与执行时间相比的输入大小/复杂度的模型,然后使用其结果来估计执行时间。
答案 2 :(得分:3)
答案 3 :(得分:2)
1,暂停问题是难以处理的,即使你有数据和程序,也无法告诉(!在一般情况下!)运行它需要多长时间。 2,暂停问题中的“程序”意味着完整的状态,例如你的程序+它处理的数据。
所以它有两次难以处理:)
答案 4 :(得分:2)
如果您知道算法的渐近运行时间,例如知道排序算法是n * log(n),您可以在小输入上运行它并计算(尽管可能只是一个范围)它对于更大的投入。问题是分析大多数算法非常困难。否则,您可以在较小的输入上运行几次并执行某种类型的regression(可能是非线性)来发现/近似算法性能特征的等式,并使用它来计算更大的输入。
答案 5 :(得分:2)
计算机科学有一整个分支致力于此:Algorithmic Complexity。简而言之,您分析代码以确定它具有哪些性能特征,例如,大多数好的排序算法的平均运行时间为O(n log n)
,其中n
是要排序的数组的大小。这意味着对100
项进行排序的时间长度为100 * ln 100 / ln 2 * x
或664x
,其中x
是运行一条指令所需的时间。
答案 6 :(得分:1)
从问题来看,我不确定您是在尝试运行此程序之前计算执行时间,还是记录脚本运行所需的时间。如果你想要预先计算,我同意其他答案,说这是不可能的。
如果要记录执行时间,只需在程序中添加2个全局日期变量,在执行开始时立即将当前日期和时间存储在一个中,然后在终止时将时间存储在第二个变量中。使用日期差异功能为您提供经过的秒数(或您想要的时间单位)。
答案 7 :(得分:1)
很难确定,但我认为这不是暂停问题的一个版本。 (或者,至少,它可以简化,以便它不是)。
我认为,你只是要求估计关于一系列读写需要多长时间......但需要不同的读写量。
最简单的方法是进行一些经验测量(越多越好),并使用这些测量来估计未来的运行时间。如果您发现读取10 MB数据需要10秒钟,那么您可以估计100 MB可能需要大约100秒。 (当然,这假设您正在查看O(n)算法......如果没有,您将不得不相应地进行调整。)
当然,这很容易出错,因为系统上发生了其他任何事情......但是,根据您的需要,它可能会给您足够的估计值。
当然,如果您在阅读/写作时能够更新估算值,则可以改进它们。
答案 8 :(得分:1)
如果您询问实际解决方案,请使用Benchmark模块或其他记录时间的过程。然后根据输入大小绘制执行时间以显示多个输入并进行插值(但要注意外推,as this xkcd cartoon demonstrates)。
如果您想了解理论,您需要了解“computational complexity”,这是一个很好的搜索词,可以帮助您入门。
例如,如果您将数据运行一次,那么通常两倍的数据将花费大约两倍的时间。最好的搜索算法通常需要O(NlnN),所以两倍的数据需要两倍多的时间。但即使是这些也只限制了时间长度,而常量将取决于磁盘访问,内存,其他运行程序等等。
答案 9 :(得分:1)
您必须知道您的程序是否停止。它不能自动需要,但您可以确定您是否了解其设计。然后你必须至少知道你的程序渐近复杂性。如果您知道真正的复杂性公式,那然后,您可以对足够的输入集进行基准测试。然后,您可以插入数据以实现常量。最后只需将常数置于等式和计算中。容易,不是吗? ; - )
答案 10 :(得分:1)
如果您可以执行您的程序。您可以使用unix“time”命令计时。如果没有,您需要保存系统时间,然后在程序结束时再次打印出来?