计算确切的运行时,而不是实际的运行时

时间:2013-03-30 03:24:02

标签: java c++ algorithm timing

是否可以创建一个程序,比如使用字节代码,正常运行程序,通过使用每条指令的定义运行时间来保持总运行时间的计数?然后,一旦您的程序完成,您就可以获得与运行时相关的精确系统独立值,而无需反复运行程序并平均结果或查找最小值。当然,这个和实际运行时间之间的关系因变量过多而有所不同,但看起来这样的数字似乎还不错,至少可以选择使用。

所以,为了清楚起见,这里有三个问题(对不起,但这只是为了防止后续问题的简洁),相互依赖:

  1. 是否有可能,或者是否有理论结果可以阻止这种情况(暂停问题或某些事情)?

  2. 如果有可能,为什么从未使用过?由于许多实际原因,这似乎很有价值。

  3. 或者是否有一个存在,我只是错过了它?

3 个答案:

答案 0 :(得分:0)

Java实现:

int start = System.currentTimeMillis();

//Code to be timed...

int end = System.currentTimeMillis();
System.out.println(end - start);

答案 1 :(得分:0)

如果您在同一台机器上运行所有程序并使用Proccess的时间而不是实际运行时间,那么结果应该非常适合。看一下.Net框架中的Proccess类,以便于理解(它包含为您提供UserTime和proccess本身的KernelTime的属性)此类也是OS proccess API的良好包装器。 分析算法执行或完整性的另一种观点是由O符号给出的,这需要对代码进行深入分析,问题在于每个操作都不需要同时进行,所有这些理论都适用于理想的机器。 Maibe做了类似的事情,你需要为你想要支持的所有语言提供翻译,并使所有这些都非常复杂。

答案 2 :(得分:0)

基本问题是每个指令或方法或其他任何执行的次数不是任何事情的可靠预测器......除了在同一输入上再次运行相同程序需要多长时间。

要获得有用的预测器,您需要一个关于程序执行时间如何取决于其输入的良好模型。自动生成这样的模型不是一个容易处理的问题。

  • Halting Theorem表示您无法确定先验是否有任何程序将停止使用给定的输入集。

  • 在实践中,除了非常简单的程序之外,定理证明技术不能胜任任何事情。

  • 尝试通过经验手段获得模型(即通过尝试拟合实验结果的曲线)是行不通的,因为:

    • 无法计算(自动)模型的关键变量。实际上,变量甚至可能不是数字。
    • 即使你设法做到了,你现在还可以知道程序的性能是否适合任何精度的经典曲线。你可能会得到一个模型,但你知道如何准确的模型。

只是为了说明,考虑分解大量的问题。如果数字有很小的因素,那么计算时间会很快。如果它没有...那么根据维基百科,最坏情况计算复杂性的最佳可用方法分解整数是:

O(exp(((64b/9)^(1/2).(log b)^(2/3)))

其中b是数字中的位数。这对b的大值来说是难以处理的。

所以......

  • 能够给我们提供有用预测的分析解决方案相当于找到一个快速的分析解决方案,该解决方案说明一个数字是否(绝对)是可分解的,以及这些因素有多大。这是一个具有数学挑战性的问题。

  • 经验解决方案不可能存在,因为没有有用的经验模型存在......不涉及首先进行因子分解。