System.nanoTime() 返回负数

5

在尝试使用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

这对任何人都有意义吗?

2
@turbo 这不是那个问题的重复;这是由于将差异转换为 int 引起的。 - rgettman
3个回答

13

您将两个long类型的数字转换为一个int类型的数字。很可能,您的long类型数字之间的差值大于Integer.MAX_VALUE(约20亿),而将其转换为int类型时,只会保留最后32位数字,这将导致得到一个负数。此外,20亿纳秒只有2秒钟,因此任何长于此时间的数字都会溢出int类型。

请将差值保存为long类型。


0

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

Integer.MAX_VALUE = 2147483647
Integer.MIN_VALUE = -2147483648

尝试使用long来存储diff值:

long diff = stop - start;

0
在Java中,int类型的最大值(由32位表示)为2^31或2,147,483,647。 发生的情况是,当差异大于此数字时,它无法用int类型表示并且会溢出(位数不足)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接