- mongodb - 在 MongoDB mapreduce 中,如何展平值对象?
- javascript - 对象传播与 Object.assign
- html - 输入类型 ="submit"Vs 按钮标签它们可以互换吗?
- sql - 使用 MongoDB 而不是 MS SQL Server 的优缺点
出于诊断目的,我希望能够在长时间运行的服务器应用程序中检测系统时钟的变化。由于 System.currentTimeMillis()
基于挂钟时间,而 System.nanoTime()
基于独立于 (*) 挂钟时间的系统定时器,我以为我可以使用这些值之间差异的变化来检测系统时间变化。
我编写了一个快速测试应用程序,以查看这些值之间的差异有多稳定,令我惊讶的是,这些值立即以每秒几毫秒的水平出现差异。有几次我看到了更快的分歧。这是在带有 Java 6 的 Win7 64 位桌面上。我还没有在 Linux(或 Solaris 或 MacOS)下尝试过这个测试程序来查看它的性能。对于此应用程序的某些运行,差异是正的,对于某些运行,它是负的。这似乎取决于桌面在做什么,但很难说。
public class TimeTest {
private static final int ONE_MILLION = 1000000;
private static final int HALF_MILLION = 499999;
public static void main(String[] args) {
long start = System.nanoTime();
long base = System.currentTimeMillis() - (start / ONE_MILLION);
while (true) {
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// Don't care if we're interrupted
}
long now = System.nanoTime();
long drift = System.currentTimeMillis() - (now / ONE_MILLION) - base;
long interval = (now - start + HALF_MILLION) / ONE_MILLION;
System.out.println("Clock drift " + drift + " ms after " + interval
+ " ms = " + (drift * 1000 / interval) + " ms/s");
}
}
}
Thread.sleep()
时间的不准确以及中断应该与计时器漂移完全无关。
这两个 Java“系统”调用都旨在用作测量——一个用于测量挂钟时间的差异,另一个用于测量绝对时间间隔,因此当实时时钟未更改时,这些值应该以非常接近相同的速度变化,对吧?这是 Java 中的错误、弱点还是失败?操作系统或硬件中是否存在阻止 Java 更准确的东西?
我完全预计这些独立测量之间会有一些漂移和抖动 (**),但我预计每天的漂移不到一分钟。每秒 1 毫秒的漂移,如果单调,几乎是 90 秒!我观察到的最坏情况漂移可能是那个的十倍。每次我运行这个程序时,我都会在第一次测量时看到漂移。到目前为止,我运行程序的时间没有超过 30 分钟。
由于抖动,我希望在打印的值中看到一些小的随机性,但在程序的几乎所有运行中,我看到差异稳步增加,通常每秒增加 3 毫秒和几倍不止于此。
是否有任何版本的 Windows 具有类似于 Linux 的机制,可以调整系统时钟速度以缓慢地将时间时钟与外部时钟源同步?这样的事情会影响两个计时器,还是只影响挂钟计时器?
(*) 我知道在某些架构上,System.nanoTime()
必须使用与 System.currentTimeMillis()
相同的机制。我还认为可以公平地假设任何现代 Windows 服务器都不是这样的硬件架构。这是一个糟糕的假设吗?
(**) 当然,System.currentTimeMillis()
通常会有比 System.nanoTime()
大得多的抖动,因为它的粒度不是 1 毫秒大多数系统。
最佳答案
您可能会发现 this Sun/Oracle blog post about JVM timers感兴趣。
以下是那篇文章中关于 Windows 下的 JVM 计时器的几段:
System.currentTimeMillis()
is implemented using theGetSystemTimeAsFileTime
method, which essentially just reads the low resolution time-of-day value that Windows maintains. Reading this global variable is naturally very quick - around 6 cycles according to reported information. This time-of-day value is updated at a constant rate regardless of how the timer interrupt has been programmed - depending on the platform this will either be 10ms or 15ms (this value seems tied to the default interrupt period).
System.nanoTime()
is implemented using theQueryPerformanceCounter
/QueryPerformanceFrequency
API (if available, else it returnscurrentTimeMillis*10^6
).QueryPerformanceCounter
(QPC) is implemented in different ways depending on the hardware it's running on. Typically it will use either the programmable-interval-timer (PIT), or the ACPI power management timer (PMT), or the CPU-level timestamp-counter (TSC). Accessing the PIT/PMT requires execution of slow I/O port instructions and as a result the execution time for QPC is in the order of microseconds. In contrast reading the TSC is on the order of 100 clock cycles (to read the TSC from the chip and convert it to a time value based on the operating frequency). You can tell if your system uses the ACPI PMT by checking if QueryPerformanceFrequency returns the signature value of 3,579,545 (ie 3.57MHz). If you see a value around 1.19Mhz then your system is using the old 8245 PIT chip. Otherwise you should see a value approximately that of your CPU frequency (modulo any speed throttling or power-management that might be in effect.)
关于java - 为什么 System.nanoTime() 和 System.currentTimeMillis() 如此迅速地分开?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5839152/
我像那样遍历数组。 NSArray *array = [[currentRaum raumattribute] allObjects]; NSString *compositeString =
我想找到所有引用这种模式的子字符串:一些字符+一些字符+第一个字符。现在我在 Python 2.7 中有了这个: T = "i was here" m = re.findall(r"([a-z])[a
我想使用与 tidyr 分开将一列字符串(例如 [1, 58, 10] )分成几列。我的问题是有时列较短(永远不会更长)。我在同一个数据框中有很多列有这个问题。 加载包 require(tidyr)
我正在开发一个具有图形用户界面的网络测试工具。我现在面临的问题是,我无法将基础数据与 GUI 类分开。该应用程序由一个 QMainWindow 组成,它随后生成多个其他 QDialogs 并具有一些
我经常听到“策略与机制分离”的口头禅,尤其是在 Unix 哲学的背景下。这是什么意思,有哪些具体的例子?什么时候/为什么是/不是一件好事? 最佳答案 它基本上是将需求或业务功能与技术实现分离。机制是技
我正在使用 writeToFile:atomically: 方法将一些加密数据写入文本文件。问题是,需要保存的文件必须是用户加密的文件,并带有我选择的扩展名。这是我到目前为止所拥有的: [encryp
我有这串 abcdef x y z 或这个 "ab cd ef" x y z 我正试图将其解析为 s1 = "abcdef" arr = ["x","y","z"] 或者 s1 = "ab cd e
这个问题已经有答案了: One big javascript file or multiple smaller files? [duplicate] (7 个回答) 已关闭 6 年前。 我有 4 种类
我有这样的事情 - function DetailCtrl($scope) { $scope.persons = [{ id: 1, name: "Mark"
在操作(复制/移动)包含合并单元格的范围时,我总是收到错误消息“您的粘贴与合并单元格重叠。请取消合并单元格,然后重试”。但是,当尝试使用 Range#breakApart 取消合并范围内的单元格时,我
我有一个包含一些 TextFields 的 TableView。所述 TextFields 的值链接到二维数组(NSMutableArrays 的 NSArray)中的某些位置。 一个初始的干净数组定
我定义了一个标签,其中一半需要在左侧,另一半文本需要在右侧。我怎样才能解决这个问题,让另一半拉对? 我添加了 margin-right 以使文本向右拉,但它与其他 div 不一致。
我正在尝试创建一个正则表达式来将 JavaScript 中的每个单词与 .(点)分开。 function myFunction() { var url = "in.k1.k2.k3.k4.com"
如何使用 CSS 将网站的正文/内容区域与背景分开。为了向您展示我的意思,请看附图。因此,两侧的背景将扩展到拥有超大显示器的人,但内容将始终保持相同大小。 谢谢,阿马尔 http://i.imgur.
有可能用 CSS 将两个背景图像对 Angular 分开吗? 我知道如何只用一张图片制作它,但我不能用两张图片制作它。 这是一个例子: |-------------| | /|
这是一个JSFiddle我创建了展示代码的外观。我将如何给予这些 它们之间是否存在间隙,没有一个元素低于另一个元素? .main-content { width: 50%; float: le
我正在处理具有这样数据的项目(我使用带有 python 的 pandas 框架): days rain 0 1 2 0 3 1 1
我正在尝试编写一个宏来获取信息并将该信息发送到另一个函数,方法是将原始 va_list 拆分为字符串,然后从原始 va_list 生成另一个 va_list。 下面是我的代码。 调用宏 /* Usag
我需要来自 SharedToDomains 和 SharedFromDomains 的键和值数据。我想打印这些值。 var LogResponse = DeserializeFromJson(sLog
我现在正在使用 Alamofire 来发出发布请求。我首先在 ViewController 中构建它并开始工作。但后来我试图通过在另一个 class 中构建它来分离它。我使用 singleton 并且
我是一名优秀的程序员,十分优秀!