我需要分析Java中某些算法的复杂性。为此,我计划提供大量的输入,并衡量Java实现所花费的时间。检查某些代码行之间的时间最精确的方法是什么?我需要以毫秒为单位的精度。。。
您甚至可以使用System.nanoTime()
获得纳秒分辨率。
但是,您可能需要考虑以下几点:
如何用Java编写正确的微基准测试?
使用Speed4j等库。这不仅将对调用进行基准测试,还将在日志中提供统计信息,您还可以通过JMX远程查看它们。与其把System.current..调用放在整个代码中,不如使用这样的库。
假设你有一个特殊的方法,你想放在显微镜下。你可以这样做:
long time1 = System.nanoTime();
thatMethod();
long time2 = System.nanoTime();
long timeTaken = time2 - time1;
System.out.println("Time taken " + timeTaken + " ns");
计算机真的很快,所以使用getTimeMillis()
时可能会出现时差为零的情况。因此,使用nanoTime()
您也可以使用Caliper
。他们有一个视频开始。另外,仔细阅读creichen
所指出的答案。它有很多很棒的东西。
使用System.nanoTime()
或System.currentTimeMillis()
来获取代码的开始和结束时间。请注意,微基准测试只测量JVM性能的基本方面。请注意JVM的预热阶段,在此阶段之后将启动JIT。
long start = System.currentTimeMillis();
// your code
long end = System.currentTimeMillis();
long diff = end-start;
或
long start = System.nanoTime();
// your code
long end = System.nanoTime();
long diff = end-start;
long diffInMillis = diff/1000000;
long startTime = System.currentTimeMillis();
//code lines whose time you want to calculate
long endTime = System.currentTimeMillis();
System.out.println("Took "+(endTime - startTime) + " ms");