在已知O(n)和系统时钟的情况下,我们可以计算代码的执行时间

时间:2016-11-15 01:38:01

标签: java performance

代码的时间复杂性是已知的。执行程序的系统是Intel Corei3,它是双核和CPU @ 2.4ghz - 它有4个逻辑处理器。 有了这些细节,如何计算代码的执行时间?

public class PerfmTest {
    public static void main(String[] args) {
      getexeTime(1000000);
    }

    public static void getTime (long n) {
      // long startTime = System.currentTimeMillis();
      long startTime = System.nanoTime();
      long k = 0;
      for (int i = 1; i <=5; i++) {
          // k = k + 5;
      }
      // long endTime = System.currentTimeMillis();
      long estimatedTime = System.nanoTime() - startTime;
      //System.out.println("Execution time for n = " + n + " is " + (endTime - startTime) + " milliseconds");
      System.out.println("Execution time for n = " + n + " is " + estimatedTime + " nanoseconds");
    }
 }

输出为855纳秒。

2 个答案:

答案 0 :(得分:1)

如果我理解正确,您会问我们是否可以通过了解系统规格和相关代码来计算运行时间。答案是不,我们无法计算执行时间

原因是代码不是孤立运行的。这四个处理器不仅 运行您的代码。操作系统在后台运行,服务正在运行,等等。

事实上,我们不仅无法计算代码的运行时间,而且如果我们已经知道运行时间,我们甚至无法预测未来的运行时间。在第二次运行可能会改变输出的代码期间可能发生任何事情。更多上下文切换,更多后台任务或其他任何内容。

在运行性能测试时,我经常多次体验过这些效果。如果计算机空闲时间较长,或者上次启动是冷启动而不是待机/恢复等,则相同的测试套件将产生不同的时序。

如果您询问如何衡量代码的运行时间,以上所有内容仍然适用。从本质上讲,您正在谈论运行实验。在实验中,必须控制所有外部变量。对于每次测试运行,系统必须处于相同的状态,这在技术上是可以实现的,但肯定远远超出了这个问题的范围。

我们唯一可以做出任何合理的成功期望的事情是预测算法A的性能优于算法B(甚至有时会产生不同输入,输入大小等的意外结果)。我们无法准确预测算法A需要多长时间。

<强>摘要

如果没有极端受控的环境(超出了本问题的范围),就无法计算,估算甚至衡量任意代码的运行时间。

答案 1 :(得分:-1)

  

已知 O(n)且系统时钟已知,我们可以计算代码的执行时间。

没有。 O(N)仅表示执行时间与 N 线性增长,即通过形式的线性方程式

t = aN+b

其中y是时间,N N ,而ab是常量,但它没有'告诉你常数。