PowerShell的定时器/秒表精确度(PowerShell timer/stopwatch ac

2019-07-19 04:07发布

我发现System.Diagnostics.Stopwatch类有什么似乎是衡量不准确,甚至在很短的时间内(即20秒)。 我的过程被示出的20.3+秒编码运行20秒的过程中的经过时间:

$elapsed = [System.Diagnostics.Stopwatch]::StartNew()
write-host "Started at $(get-date)"

for ($t=1; $t -le 20; $t++) {
    Write-Host "Elapsed Time: $($elapsed.Elapsed.ToString())"
    sleep 1
}

write-host "Ended at $(get-date)"
write-host "Total Elapsed Time: $($elapsed.Elapsed.ToString())"

    Started at 02/02/2013 15:08:43
    Elapsed Time: 00:00:00.0329924
    Elapsed Time: 00:00:01.0417435
    Elapsed Time: 00:00:02.0547547
    Elapsed Time: 00:00:03.0689716
    Elapsed Time: 00:00:04.0820497
    Elapsed Time: 00:00:05.0963413
    Elapsed Time: 00:00:06.1113915
    Elapsed Time: 00:00:07.1244044
    Elapsed Time: 00:00:08.1396105
    Elapsed Time: 00:00:09.1528952
    Elapsed Time: 00:00:10.1659905
    Elapsed Time: 00:00:11.1800884
    Elapsed Time: 00:00:12.1940009
    Elapsed Time: 00:00:13.2081824
    Elapsed Time: 00:00:14.2223585
    Elapsed Time: 00:00:15.2375023
    Elapsed Time: 00:00:16.2506360
    Elapsed Time: 00:00:17.2656845
    Elapsed Time: 00:00:18.2790676
    Elapsed Time: 00:00:19.2928700
    Ended at 02/02/2013 15:09:04
    Total Elapsed Time: 00:00:20.3080067

就是这种精度漂移的使用PowerShell中的秒表类时预期的? 这似乎增加不成比例的时间跨度(即,10秒关闭的0.1和20由0.3)。 是我的代码错?

Answer 1:

问题是,什么是你想怎么办? 如果你正试图确定需要多长时间运行脚本的,就是这样,你应该使用秒表。 但是,如果你想在指定时间内启动命令的一个新的序列,使用[System.Timers.Timer]和定时器对象所经过的事件注册事件。 然后指定注册的事件来什么,你所要完成的动作。



Answer 2:

你有20个1秒钟间隔,但你还有其他的事情去上也是如此。 有一个循环,增量和测试一个变量,你写在每个迭代所经过的时间。 这些额外的事情需要时间。

这还是有一个20秒暂停,而经过时间接近20秒,因为没有那么多的东西,PowerShell有做:

$elapsed = [System.Diagnostics.Stopwatch]::StartNew()
write-host "Started at $(get-date)"
sleep 20
write-host "Ended at $(get-date)"
write-host "Total Elapsed Time: $($elapsed.Elapsed.ToString())"


文章来源: PowerShell timer/stopwatch accuracy