我目前有以下代码:
public static int currentTimeMillis()
{
long millisLong = System.currentTimeMillis();
while ( millisLong > Integer.MAX_VALUE )
{
millisLong -= Integer.MAX_VALUE;
}
return (int)millisLong;
}
以int
格式返回当前时间(不完全相同,但可以用于时差)。出于很好的理由,我无法使用long
。
是的,我只对两次通话之间的区别感兴趣,这种方法效果很好。但它看起来不错。我知道。并且效率低下。我知道。所以我的问题是,我该如何改进呢?
我需要一个返回int
的函数,以便:
int x1 = currentTimeMillis(); //my function
long y1 = System.currentTimeMillis();
.....
int x2 = currentTimeMillis();
long y2 = System.currentTimeMillis();
// here, x2 - x1 must be equal to y2 - y1
编辑:
仅供参考,我想这样做以进行基准测试。我正在并行运行多个线程的测试,stop事件由外部组件触发。我也是以仅支持int
的方式序列化数据,而我正在序列化的对象不能有long
个成员。
答案 0 :(得分:27)
您的功能基本上与以下内容相同:
public static int currentTimeMillis() {
return (int) (System.currentTimeMillis() % Integer.MAX_VALUE);
}
以上可能就是你要找的东西。 modulus operator %
返回分区的剩余部分。我只会将它包装在另一个隐藏它的类中。将“当前时间毫秒”作为具有错误值的int进行混淆是令人困惑的。类似的东西:
Stopwatch stopwatch = Stopwatch.start();
// ...
int elapsed = stopwatch.elapsed();
与
public final class Stopwatch {
private long start;
private Stopwatch() {
start = System.currentTimeMillis();
}
public static Stopwatch start() {
return new Stopwatch();
}
public int elapsed() {
return (int) (System.currentTimeMillis() - start);
}
}
当开始时间小于Integer.MAX_VALUE
并且结束时间大于Integer.MAX_VALUE
时,这也可以更好地防止出现问题,因此会溢出回Integer.MIN_VALUE
并继续那里。
答案 1 :(得分:3)
请注意,如果currentTimeMillis
值在Integer.MAX_VALUE
和x1
之间翻过x2
,则最终x2 - x1
为负值。有两种方法可以解决这个问题。
x2 - x1
时,检查它是否为负数。如果是,请再次向其添加Integer.MAX_VALUE
。 (这假设不会检查实际超过Integer.MAX_VALUE
距离的两个时间值。)Integer.MAX_VALUE
标记。作为旁注,我相信我们都在想你不使用long
值的理由是什么?
答案 2 :(得分:2)
你无法100%满足你的条件,因为在执行过程中你的程序行之间的时间可能会过去,这会让事情略有不同。但这些数字并没有太多关闭。在不了解您的问题的情况下,我不得不假设您对实际时间不感兴趣。也许你只对经过的时间感兴趣?你在运行一些基准测试吗?如果您只需要经过的时间,那么@BalusC建议的模数解决方案就可以了。
答案 3 :(得分:2)
而不是找到模数,更快的解决方案是简单的按位掩码操作:
public static int currentTimeMillis() {
return (int) (System.currentTimeMillis() & 0x00000000FFFFFFFFL);
}
答案 4 :(得分:2)
你可以做到
public static int currentTimeMillis() {
return (int) System.currentTimeMillis();
}
如果它是否定的,那么只要你有所作为就没关系。 e.g。
int start = currentTimeMillis();
// will be positive for differences less than 24 days.
int time = currentTimeMillis() - start;
使用这种方法可以避免溢出问题,因为它们会取消,例如
int start = Integer.MAX_VALUE;
// 1 ms later
int time = Integer.MIN_VALUE /*due to overflow*/ - start;
// time equals 1 due to underflow.