【发布时间】:2013-12-13 01:23:15
【问题描述】:
我有一个从ArrayBlockingQueue() connectionPool. 获取对象的线程如果 ArrayBlockingQueue() 为空,则该线程可能会被阻塞。为了测量调用线程被阻塞的时间,我使用以下代码:
long start = System.nanoTime();
DataBaseEndPoint dbep = connectionPool.take();
long end = System.nanoTime();
long elapsed = (end - start)/1000000;
现在,我担心未阻塞的线程可能会开始在多处理器机器中的不同处理器上运行。在这种情况下,我不完全确定不同处理器上使用的“系统计时器”是否相同。 这篇博文 (http://www.javacodegeeks.com/2012/02/what-is-behind-systemnanotime.html) 建议 Linux 为每个处理器使用不同的时间戳计数器(也用于 System.nanotime()),这确实会弄乱上面示例中的经过时间计算。
该值是从带有 CLOCK_MONOTONIC 标志的 clock_gettime 读取的 使用 TSC 或 HPET。与 Windows 的唯一区别是 Linux 甚至没有尝试同步从不同 CPU 读取的 TSC 值, 它只是按原样返回。这意味着价值可以反弹并且 与读取它的 CPU 的依赖关系向前跳转。
但是,此链接 (http://lwn.net/Articles/209101/) 表明 TSC 不再用于高分辨率计时器。
...最近更新的高分辨率计时器和动态滴答补丁 set 包括一项禁用 TSC 的更改。看来 高分辨率计时器和动态滴答功能不兼容 TSC...
那么,问题是,Linux 机器目前使用什么来将值返回给System.nanotime()?并且,在上述情况下使用System.nanotime() safe 来测量经过的时间(在另一个处理器上启动的阻塞线程)。如果不安全,还有什么办法?
【问题讨论】:
标签: java linux benchmarking