System.nanoTime()变为负数

时间:2014-01-24 17:51:10

标签: java

当尝试使用System.nanoTime()调查各种任务的运行时,当输入数据集足够大时,该值变为负值。

使用的示例代码:

long start = System.nanoTime();
run();
long stop = System.nanoTime();

int diff = (int) (stop-start);
System.out.println(data_size+", "+diff);

在越来越大的数据集上调用run()时,输出如下所示:

1, 80000
10, 4310000
50, 48077000
100, 171363000
250, 1061924000
500, 14018704
750, 998074408
1000, -41025184
1500, -81710664
2000, -273795736
2500, 768997600
3000, -39161248

这对任何人都有意义吗?

3 个答案:

答案 0 :(得分:12)

您将两个long之间的差异转换为int。可能,您的long差异长于Integer.MAX_VALUE(约20亿),而int的强制转换占用最后32位,产生负数。此外,20亿纳秒只有2秒,所以任何时间都会溢出int

将差异保持为long

答案 1 :(得分:0)

我猜这是一个整数溢出问题。 int范围位于:

Integer.MAX_VALUE = 2147483647
Integer.MIN_VALUE = -2147483648

尝试使用long来存储diff值:

long diff = stop - start;

答案 2 :(得分:0)

在Java中,int的最大数字(由32位表示)是2 ^ 31或2,147,483,647。 发生的事情是当差异大于这个数字时,它不能用int和溢出表示(用完比特)