【问题标题】:Event timestamps in a multi-threaded environment多线程环境中的事件时间戳
【发布时间】:2014-10-05 23:12:21
【问题描述】:

我正在编写一些 Web 服务的代码,我想跟踪请求的到达速度。我通过使用 System.nanoTime() 记录每个请求的时间戳来做到这一点。我之所以选择它而不是 System.currentTimeMillis(),是因为我只关心相对于当前时间的时间,而不是任何日历,并且我不希望它受到系统时钟更新的影响。

但是,nanotime() 似乎在多核环境中表现不佳,因为每个 CPU 内核的启动时间会有所不同。

我正在寻找一种方法来获取数字 (long) 时间戳,即:

  • 与当前日历时间无关
  • 跨多个内核/线程保持一致
  • 相对便宜(最好不使用反射)

有什么想法吗?

【问题讨论】:

  • System.currentTimeMillis()System.nanoTime() 是从底层系统中提取的。我在某处读到System.nanoTime() 并不总是拉处理器时间,但在某些实现中使用电池定时器。但我再也找不到源头了。无论如何,它使用系统上可用的最精确的计时器 (docs.oracle.com/javase/1.5.0/docs/api/java/lang/…)
  • 你会比较不同线程的结果吗?
  • 如果您在程序启动时创建任何时间戳 (System.currentTimeMillis()),然后创建另一个,减去这两个,它们将是“经过的时间量”,与日历和还要别的吗。他们只是“从那一刻到现在已经过去了多少时间”。它能解决你的问题吗?
  • 您真的要发布处理数千(数百万)个数字吗?相反,您可能希望保留一段时间内的请求计数(简单计数器,然后每隔(秒?或其他时间段)提取信息。总体上应该更准确
  • AtomicLong.incrementAndGet() 正式符合您的所有条件。

标签: java time timer


【解决方案1】:

除非线程显式同步,否则您无法保证生成时钟值。显然它对性能有影响。你应该重新设计你的系统,不要依赖这样的时钟。如果您需要多线程系统中的计时,也许您应该查看Vector Clock

【讨论】:

    猜你喜欢
    • 2020-07-11
    • 2012-06-26
    • 2018-02-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多