首页 > 解决方案 > Stopwatch.GetTimestamp() 在 linux 和 windows 上产生不同的结果

问题描述

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

如果我有这个小代码片段:


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()在两种环境之间产生如此大不相同的数字?

标签: c#linuxwindowsasp.net-core-3.1.net-core-3.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 对此答案的评论


推荐阅读