是时候执行java程序了

时间:2018-01-18 10:32:11

标签: java

我正在尝试获取java程序算法的执行时间。 我已经查看了类似的问题并尝试了几种方法来做到这一点,但是当我打印时间流逝时,我总是得到0。

Instant start = Instant.now();
//Method I want to get the exec time
Instant end = Instant.now();

System.out.println("\nTime lapse: "+Duration.between(start, end));

打印:

Time lapse: PT0S

以及:

 Date d = new Date();
 long t1, t2;

 t1 = d.getTime();
 //Method I want to get the exec time
 t2 = d.getTime(); 

 System.out.println("\nTime lapse: "+(t2-t1));

输出:

 Time lapse: 0

同时,用完全相同的方法得到C的执行时间,给出了一个公平的结果:

#include <time.h>

clock_t start, end;
double time;

start = clock(); 
//Method I want to get the exec time
end = clock();

time = (double) (end-start) / CLOCKS_PER_SEC; 

printf("\nTime lapse: %f\n", time);

输出:

Time lapse: 0.000004

为什么我不能用Java做到这一点?

修改

我尝试按照建议使用getTimeInMillis():

Calendar cal = Calendar.getInstance();
double start = cal.getTimeInMillis();

//Method I want to get the exec time

double end = cal.getTimeInMillis();

System.out.println("\nTime lapse: "+(end - start));

输出:

Time lapse: 0.0

最终编辑:好的,程序确实在不到一毫秒的时间内运行,这就是为什么我不断得到0的原因,我解决了@Ayo K的建议,我使用了 System.nanoTime()最终得到一个结果。

3 个答案:

答案 0 :(得分:1)

要实现这一点,你必须以毫秒为单位获得时间,然后才能获得差异。

您可以使用System.currentTimeMillis()。然后在最后得到差异。

示例

long start = System.currentTimeMillis();
System.out.println("start: "+start);
long stop = System.currentTimeMillis();
System.out.println("stop: "+stop);
///convert to seconds
System.out.println((stop-start)/1000f);

结果:

0.057

修改 如果代码在不到一毫秒的时间内运行,您可以使用System.nanoTime()使用Nano秒。 出于模拟目的,您可以调用Thread.sleep(n)来创建延迟,其中n是您打算延迟的时间(以毫秒为单位)。

答案 1 :(得分:1)

Instant的示例:

Instant s = Instant.now();
for (int i = 0; i < 100000; i++) {
    System.out.println(i);
}
Instant s1 = Instant.now();

System.out.println(s1.getNano() - s.getNano());
System.out.println(Duration.between(s, s1));

打印时间:

347000000
PT0.347S

Date

Date d = new Date();
for (int i = 0; i < 100000; i++) {
    System.out.println(i);
}
Date d1 = new Date();

System.out.println(d1.getTime() - d.getTime());

打印:

389

现在你只需要计算你想要的类型(秒,毫秒或其他)。如果名称不是不言自明的话,文档会告诉你从方法中得到什么

答案 2 :(得分:0)

在使用Date的示例中,您需要重新创建Date对象(构造函数集的时间为当前时间):

int t1 = (new Date()).getTime();
//method you want to check
int t2 = (new Date()).getTime();

或者只使用System.getCurrentTimeMillis()一次,然后once after