【问题标题】:Stopwatch.GetTimestamp() produced different results on linux vs windowsStopwatch.GetTimestamp() 在 linux 和 windows 上产生不同的结果
【发布时间】:2021-07-16 04:55:51
【问题描述】:

我希望有人可以向我解释为什么下面的函数在 linux 和 windows 上会产生令人难以置信的不同结果。

如果我有这个小sn-p代码:


var elapsed = Stopwatch.GetTimestamp() / TimeSpan.TicksPerMillisecond;

Thread.Sleep(1001); // lets sleep for one second

var ts = Stopwatch.GetTimestamp() / TimeSpan.TicksPerMillisecond; 
var result = ts  - elapsed  > 10000L // roughly 10 seconds

在windows环境下resultfalse

但是在 linux 环境中 resulttrue

我读过 Stopwatch.GetTimestamp() 依赖于处理器。但这似乎太过分了。

据我所知,GetTimestamp 在 Windows 和 Linux 上产生的值截然不同。

例如在我的情况下运行上面的代码

在 Windows 上,Stopwatch.GetTimestamp() 产生的值大致在 165100732 的范围内

在 Linux 上 Stopwatch.GetTimestamp() 产生的值超过 200 倍,例如349232049523

所以我可以看到为什么result 不同,即在 Windows 上它记录了 1 秒的经过时间,但在 Linux 上记录了接近 100 秒的经过时间。所以那部分很好。

所以问题归结为为什么Stopwatch.GetTimestamp() 会在两个环境之间产生如此大不相同的数字?

【问题讨论】:

  • 或者(可能更有可能)...为什么Thread.Sleep(1001) 在 Linux 上需要这么长时间才能唤醒?
  • 你确定你的最后一行是正确的吗? docs.microsoft.com/en-us/dotnet/api/… 声明 TicksPerMillisecond 是 10000,所以我不认为 10000 大约是 10 秒。

标签: c# linux windows asp.net-core-3.1 .net-core-3.1


【解决方案1】:

在进行了更多挖掘之后,我发现使用Stopwatch.GetTimestamp() 时执行的毫秒计算不正确。

更新如下代码后,它开始表现一致。

var elapsed = Stopwatch.GetTimestamp() / (Stopwatch.Frequency / 1000);

Thread.Sleep(1001); // lets sleep for one second

var ts = Stopwatch.GetTimestamp() /  (Stopwatch.Frequency / 1000); 
var result = ts  - elapsed  > 10000L // roughly 10 seconds

感谢 Jens 对此answer的评论

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-07-06
    • 2014-05-27
    • 1970-01-01
    • 2015-05-04
    • 1970-01-01
    • 2018-01-10
    • 2013-05-20
    • 1970-01-01
    相关资源
    最近更新 更多