Stopwatch.GetTimestamp() 在 linux 和 windows 上产生了不同的结果
Stopwatch.GetTimestamp() produced different results on linux vs 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 上产生的值截然不同。
例如在我的例子中 运行 上面的代码
On Windows Stopwatch.GetTimestamp()
产生的值大致在 165100732
范围内
On Linux Stopwatch.GetTimestamp()
产生的值超过 200 倍,例如349232049523
所以我明白了为什么 result
不同,即在 Windows 上它记录了 1 秒的经过持续时间,但在 Linux 上记录了接近 100 秒的经过持续时间。所以那部分没问题。
所以问题归结为为什么 Stopwatch.GetTimestamp()
在两个环境之间产生如此不同的数字?
在进行更多挖掘后,我发现在使用 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
我希望有人能向我解释为什么下面的函数在 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 上产生的值截然不同。
例如在我的例子中 运行 上面的代码
On Windows Stopwatch.GetTimestamp()
产生的值大致在 165100732
On Linux Stopwatch.GetTimestamp()
产生的值超过 200 倍,例如349232049523
所以我明白了为什么 result
不同,即在 Windows 上它记录了 1 秒的经过持续时间,但在 Linux 上记录了接近 100 秒的经过持续时间。所以那部分没问题。
所以问题归结为为什么 Stopwatch.GetTimestamp()
在两个环境之间产生如此不同的数字?
在进行更多挖掘后,我发现在使用 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