【问题标题】:Time accumulation时间积累
【发布时间】:2018-04-10 10:35:36
【问题描述】:

我在使用计时器时注意到的一点是,累积时间似乎比正常时间进一步增加。

这是一个简单的例子:

$time = microtime(true);

for (;;) {
    time_nanosleep(2, 0);
    var_dump(microtime(true) - $time);
}

现在我预计var_dump 的计算输出会增加两秒,它的精度很接近,但奇怪的是 4 点精度也增加了:

float(2.0001111030579)
float(4.000256061554)
float(6.0003678798676)
float(8.0004849433899)
float(10.000600099564)
float(12.000720024109)
float(14.000848054886)
float(16.000955104828)
float(18.001054048538)
float(20.001163005829)
float(22.001266002655)
float(24.001379013062)
float(26.001489877701)
float(28.001588106155)
float(30.001708984375)
float(32.001836061478)

在我看来,经过一段较​​长的时间后,计数会增加一秒,鉴于我每两秒检查一次系统时间,这似乎是不可能的。

可能有一个合理的解释,这个计时器实际上是准确的,但我不知道它是什么。谁能解释一下?

【问题讨论】:

  • 为什么这么奇怪?每一行代码都需要时间来执行。
  • @jeroen Ye,我刚走开就意识到问题不在于时间的计算方式。我的想法是支票在某种程度上是免税的。

标签: php time timer precision


【解决方案1】:

基于 cmets 中的实现,以下代码至少保证 accuracy 一致性为 0.0001 秒:

$interval = 2000000;
$thisInterval = $interval;

$time = microtime(true);

for (;;) {
    time_nanosleep(
        floor($thisInterval / 1000000),
        fmod($thisInterval, 1000000) * 1000
    );
    $elapsed = microtime(true) - $time;
    $thisInterval = $interval - (fmod($elapsed, $interval / 1000000) * 1000000);

    var_dump($elapsed);
}

【讨论】:

    猜你喜欢
    • 2020-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 2010-11-05
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多