【发布时间】: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()正式符合您的所有条件。