提问人:Luchian Grigore 提问时间:11/23/2011 最后编辑:Luchian Grigore 更新时间:11/24/2011 访问量:25346
当前毫秒,从 long 到 int
Current milliseconds, from long to int
问:
我目前有以下代码:
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
编辑:
仅供参考,我想这样做进行基准测试。我正在多个线程上并行运行测试,停止事件由外部组件触发。我还以仅支持 的方式序列化数据,并且我正在序列化的对象不能有成员。int
long
答:
您的函数与以下功能基本相同:
public static int currentTimeMillis() {
return (int) (System.currentTimeMillis() % Integer.MAX_VALUE);
}
以上可能就是你要找的。模运算符返回除法的余数。我只会把它包装在另一个隐藏起来的类中。也就是说,将“当前时间(以毫为单位)”作为具有错误值的 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
评论
long
int
您将无法 100% 满足您的条件,因为在执行过程中程序中的行之间可能会经过时间,这会稍微偏离情况。但这些数字不会有太大的差异。在不了解您的问题的情况下,我不得不假设您对实际时间不感兴趣。也许你只是对经过的时间感兴趣?您是否正在运行一些基准测试?如果您只需要经过的时间,@BalusC建议的模量解就可以了。
评论
与其找到模数,不如使用简单的按位掩码操作:
public static int currentTimeMillis() {
return (int) (System.currentTimeMillis() & 0x00000000FFFFFFFFL);
}
评论
power of 2
请注意,如果该值在 take 和 之间滚动,则最终将得到负值。有两种方法可以解决这个问题。currentTimeMillis
Integer.MAX_VALUE
x1
x2
x2 - x1
- 使用 BalusC 的方法,然后在减去时检查它是否为负数。如果是,请再次添加。(这假设不会检查两个实际上相距超过距离的时间值。
x2 - x1
Integer.MAX_VALUE
Integer.MAX_VALUE
- 首次初始化类时,将当前时间存储为私有静态值。从那时起,使函数返回当前时间与第一次启动时间之间的差值。这假定这些时间值在系统重新启动时不需要保留,并且系统不会处于足够长的生存状态而无法通过标记。
Integer.MAX_VALUE
顺便说一句,我相信我们都想知道你不使用值的充分理由是什么?long
你可以做
public static int currentTimeMillis() {
return (int) System.currentTimeMillis();
}
如果它是负面的,只要你有所作为,那就没关系了。例如
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.
上一个:在基元类型指针之间进行强制转换
评论