Java-测量方法执行时间

Java-测量方法执行时间,java,multithreading,timing,stopwatch,Java,Multithreading,Timing,Stopwatch,我尝试使用计时器测量算法的复杂性,以测量执行时间,同时更改输入数组的大小 我目前掌握的代码相当简单: public void start() { start = System.nanoTime(); } public long stop() { long time = System.nanoTime() - start; start = 0; return time; } 它似乎工作得很好,直到数组的大小变得非常大,而我所期望的O(n)复杂度算法结果是O(n^

我尝试使用计时器测量算法的复杂性,以测量执行时间,同时更改输入数组的大小

我目前掌握的代码相当简单:

public void start() {
    start = System.nanoTime();
}

public long stop() {
    long time = System.nanoTime() - start;
    start = 0;
    return time;
}
它似乎工作得很好,直到数组的大小变得非常大,而我所期望的O(n)复杂度算法结果是O(n^2)。我相信这是由于CPU上的线程,其他进程在运行时会占用更多的时间,n的值会更大


基本上,我想测量我的进程已经运行了多长时间,而不是从调用算法到现在已经运行了多长时间。在Java中有没有一种简单的方法可以做到这一点

Java中的基准测试是一个困难的问题,尤其是因为当您的方法得到越来越多的优化时,JIT可能会产生奇怪的效果。考虑使用一个专用工具。关于如何使用它和测量不同输入大小的性能的示例如下。

测量执行时间是一个非常有趣但也很复杂的主题。要在Java中正确地实现这一点,您必须了解一点JVM的工作原理。这是一篇来自developerWorks的关于基准测试和度量的好文章。读一下,它会对你有很大帮助

作者还提供了一个进行基准测试的小框架。您可以使用这个框架。它将为您提供所需的详细信息—CPU消耗时间,而不是前后的两个时间戳。该框架还将处理JVM预热,并跟踪实时编译


您还可以使用类似Eclipse的性能监视器。这种性能监视器的问题是,它不执行基准测试。它只跟踪应用程序当前使用的时间、内存等。但这并不是一个真正的度量——它只是特定时间的快照。

如果您想要当前线程(或者任何任意线程)的实际CPU时间,而不是挂钟时间,那么您可以通过ThreadMXBean获得它。基本上,在一开始就这样做:

ThreadMXBean thx = ManagementFactory.getThreadMXBean();
thx.setThreadCpuTimeEnabled(true);
然后,每当您想要获取当前线程的已用CPU时间时:

long cpuTime = thx.getCurrentThreadCpuTime();
您将看到ThreadMXBean也会调用以获取任意线程的CPU时间和其他信息

关于时间安排复杂性的其他评论也适用。一段代码的单独调用的时间可以取决于CPU的状态以及JIT编译器在特定时刻的决定。一个算法的整体可伸缩性行为通常是一种趋势,它会在许多调用中出现,您将始终需要为计时中的一些“异常值”做好准备


另外,请记住,仅仅因为某个特定的计时是以纳秒(或者说毫秒)表示的,并不意味着该计时实际上具有这种粒度。

谢谢,这篇文章非常有用。