2

我读过一些低延迟技术论文,他们通过 CPU 测量时序,因为它更准确。

通常在Java中我会使用:

System.nanoTime()

在 C++ 中,我相信我曾经使用过一种性能计数器方法,我在网上发现它可以精确到纳秒。它使用 LARGE_INTEGER,分配给您希望测量的准确度,然后通过引用传递给 QueryPerformanceCounter() 并返回除以频率的答案。

是否有任何 Java 等效代码来根据 CPU 测量时间,还是必须使用某种 PInvoke?

编辑:

https://www.google.co.uk/url?sa=t&rct=j&q=&esrc=s&source=web&cd=1&ved=0CCYQFjAA&url=http%3A%2F%2Fdisruptor.googlecode.com%2Ffiles%2FDisruptor-1.0.pdf&ei= ImmQT5WQMOaW0QWW2sTwAQ&usg=AFQjCNEeGmYXzJa8huMdRGN2p4n8YH-jfg

要以这种精度水平计时,必须使用来自 CPU 的时间戳计数器。我们选择了具有不变 TSC 的 CPU,因为旧处理器会因省电和睡眠状态而受到频率变化的影响。

我对 Windows 和 Linux 的答案很感兴趣,但如果人们能解释他们的答案是否特定于其中一个,我将不胜感激。

4

2 回答 2

2

System.nanoTime() 可以有一个快速的纳秒分辨率计时器,具体取决于操作系统。在某些操作系统上,这与 20 ns 一样快。

在这个库中,我使用了 RDTSC,因为 RHEL 5.x 不是速度很快的操作系统之一。:( https://github.com/peter-lawrey/Java-Thread-Affinity在快速 PC 上耗时不到 10 ns。

使用 cpu 计数器的问题在于它在不同的套接字上是不同的。如果你的程序只在一个套接字上运行,这不是问题。

于 2012-04-19T19:50:26.623 回答
1

微基准测试有几个可能被忽视的内在变量

  • 垃圾回收的Java效果
  • JIT 优化的 Java 效果需要一些时间来“预热”
  • Java 目标虚拟机
  • Java VM 设置(-Xnnnn 设置,以及客户端与服务器模式)
  • 目标操作系统差异
  • 目标 CPU 差异
  • quiescence:CPU在后台多任务处理其他事情有多忙
  • 基准代码本身的开销

Caliper Micro-benchmarking 框架这样的工具试图解决上述部分但不是全部问题。我什至不确定它试图做什么。但至少它所做的主要明显的事情是尝试预热 JIT,运行基准代码固定次数并平均迭代,并重复该练习几次,直到运行之间有一些可接受的容差差异。它还捕获和记录环境,以便未来的基准测试可以将苹果与苹果(而不是橙子)进行比较。它允许您使用不同的 VM 设置或程序参数轻松地重复和比较以上所有内容,并比较每个结果。

也就是说,不曲解结果,或者更可能不让其他人曲解结果,仍然是一项棘手且充满危险的努力。

编辑(添加)实际上 JIT 可以双向切割。虽然您通常希望 JIT 预热,但它也可以优化掉您希望作为基准测试的一部分包含的内容。因此,您必须以这样一种方式编写基准测试,以通过强制每个循环以对您所测量的内容重要/重要的方式实际变化来预测和防止循环不变量之类的事情被优化掉。

于 2012-04-19T21:09:38.437 回答