【发布时间】: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环境下result是false
但是在 linux 环境中 result 是 true
我读过 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