gpt4 book ai didi

java - 将人类时间与计算机时间结合成合成时间

转载 作者:行者123 更新时间:2023-11-30 07:08:26 25 4
gpt4 key购买 nike

我正在尝试将 Java 8 中的高数据速率 UDP 流接口(interface)模拟器/测试器写入具有非常准确的时间处理器卡的实时机器。每条消息都有一个时间字段,该字段以微秒为单位。该接口(interface)依赖于高分辨率时间处理器来进行数据包排序。该界面依赖于我没有的高精度时间卡,需要从等式中模拟。我想我可以使用这样的东西来逃避:

TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());

它确实有效,但在运行了很长一段时间后,我发现 UDP 对我不利,因为我发送了几百个具有相同确切时间戳的乱序数据包,而接口(interface)的另一端无法分辨出它发送的数据包收到的东西有问题。接口(interface)在一定程度上可以容忍这种情况,但这在具有高精度时钟的真实系统上并不是真正的问题。

为了缓解这种情况,我在 currentTimeMillis() 中添加了一种合成微秒的感觉,如下所示:

class TimeFactory {
private long prev;
private long incr;

public long now() {
final long now = TimeUnit.MILLISECONDS.toMicros(System.currentTimeMillis());
long synthNow = now;
if(now == prev) {
if(incr < 999) {
incr += 1;
}

synthNow += incr;
} else {
incr = 0;
}

prev = now;
return synthNow;
}
}

有没有人像这样处理过合成时间?有没有其他方法可以收紧这段代码,或者有更好的方法来处理这个问题(以某种方式使用 nanoTime)?如果我确实发送了超过 999 个数据包,将其递增到毫秒范围内是否安全(即:递增 + 1000 或更多)?看起来我在 currentTimeMillis() 调用之间有大约 10-15 毫秒的差异,但我确信这非常依赖于系统。

最佳答案

如果有人对此感兴趣,我最终解决了缺少高分辨率系统时钟的问题。它会给我一个合成微秒计数器,该计数器会递增,直到 System.currentTimeMillis() 返回更新值或您调用了 999 次。在实践中,我最多只看到 ~500 增量。看起来我不会担心溢出到毫秒范围内。

我仍然愿意接受其他更现实的结果替代方案。

public class SyntheticMicrosClock extends Clock {
private final ZoneId zone;
private long prev;
private long incr;

SyntheticMicrosClock (ZoneId zone) {
this.zone = zone;
}
@Override
public ZoneId getZone() {
return zone;
}
@Override
public Clock withZone(ZoneId zone) {
if (zone.equals(this.zone)) { // intentional NPE
return this;
}
return new SyntheticMicrosClock(zone);
}
public long micros() {
final long now = TimeUnit.MILLISECONDS.toMicros(millis());
long synthNow = now;
if(now == prev) {
if(incr < 999) {
incr += 1;
}

synthNow += incr;
} else {
incr = 0;
}

prev = now;
return synthNow;
}
@Override
public long millis() {
return System.currentTimeMillis();
}
@Override
public Instant instant() {
return Instant.ofEpochSecond(0, micros());
}
}

为了使用它,我在需要的地方注入(inject)了我的合成时钟。例如:

Clock synthClock = Inject or new SynthClock(ZoneOffset.UTC);
Instant.now(synthClock);

关于java - 将人类时间与计算机时间结合成合成时间,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23973097/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com