Ton*_*ony 6 c# performance timespan stopwatch
我一直在使用C#做一个小游戏,而在另一台PC上测试游戏时,我遇到了一些奇怪的时间问题.
我已经在这个游戏中设置了所有内容,根据自上一个游戏循环后的时间进行更新,在大多数情况下应该是这样,但在第二台PC上,一切都很顺利.
我发现问题与使用该FromTicks()方法创建TimeSpan有关.我使用以下代码进行了一些测试:
class Program
{
static void Main(string[] args)
{
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
sw.Stop();
TimeSpan t = TimeSpan.FromTicks(sw.ElapsedTicks);
Console.WriteLine(t.ToString());
Console.WriteLine(sw.Elapsed.ToString());
Console.ReadKey();
}
}
Run Code Online (Sandbox Code Playgroud)
在我的主PC上,我运行了这个程序,得到了以下内容:
00:00:00.3528353
00:00:00.9856987
我完全没想到的东西.我认为第二个结果是非常不准确的,但第一个结果很好.
然后我在另一台PC上运行相同的程序,得到了这个:
00:03:20.6866734
00:00:00.998287
我很震惊.
我的问题不是我如何解决这个问题,我已经决定使用第二种方法,因为它足够准确......相反,我要求启蒙.
怎么会这样呢?为什么第一个结果如此不准确?为什么这在不同的机器上变化很大?
我检查msdn以防我使用该方法错误,但那里的例子表明我的结果应该是不可能的......
注意:
我认为CMOS电池正在死亡/死亡,这是一个因素吗?
Timespan的Ticks和Stopwatch的Ticks是不同的.要进行协调,请使用Stopwatch Elapsed属性,该属性可根据计算机的刻度正确转换为TimeSpan.
System.Diagnostics.Stopwatch sw = new System.Diagnostics.Stopwatch();
sw.Start();
System.Threading.Thread.Sleep(TimeSpan.FromSeconds(1));
sw.Stop();
// don't load a TimeSpan with ElapsedTicks, these have diff frequency,
// call Elapsed instead to get TimeSpan.
TimeSpan t = sw.Elapsed;
Console.WriteLine(t.ToString());
Console.ReadKey();
Run Code Online (Sandbox Code Playgroud)
或者,您当然可以自己划分频率等,但这需要做更多的工作.主要的一点是你不应该把TimeSpan的Ticks和Stopwatch的Ticks一样考虑.
相关主题:什么是计时器刻度,秒表使用的单位.ElapsedTicks
总结:秒表的频率可以是在不同的硬件,这意味着蜱(其间隔是基于频率)不同,为不同尺寸(和不同的尺寸,以在所述时间跨度和datetime对象蜱)的.
简而言之,Elapsed直接使用该属性:
TimeSpan t = sw.Elapsed;
Run Code Online (Sandbox Code Playgroud)
...或者如果需要执行计算,请使用Ticks属性Elapsed:
TimeSpan t = TimeSpan.FromTicks(2*sw.Elapsed.Ticks);
Run Code Online (Sandbox Code Playgroud)
带引用的长版本:
http://msdn.microsoft.com/en-us/library/system.diagnostics.stopwatch.elapsedticks.aspx是经过时间刻度的msdn页面.值得注意的是:
此属性表示基础计时器机制中已过去的滴答数.刻度是秒表计时器可以测量的最小时间单位.使用"频率"字段将ElapsedTicks值转换为秒数.
从频率字段的页面:
定时器频率表示定时器精度和分辨率.例如,每秒200万个滴答的定时器频率等于每个滴答500纳秒的定时器分辨率.换句话说,因为一秒等于10亿纳秒,每秒200万个滴答的定时器频率相当于每10亿纳秒2百万个滴答,这可以进一步简化为每500纳秒1滴.
频率值取决于基础计时机制的分辨率.如果安装的硬件和操作系统支持高分辨率性能计数器,则Frequency值反映该计数器的频率.否则,频率值基于系统计时器频率.
由于秒表频率取决于安装的硬件和操作系统,因此在系统运行时频率值保持不变.
因此,秒表的频率在不同的硬件上可能是不同的,这意味着刻度线具有不同的尺寸(并且与时间跨度和日期时间对象中的刻度尺寸不同).
有趣的是,您已经使用了Elapsed属性StopWatch,它为您提供了一个时间跨度.sw.Elapsed是一个TimeSpan,它可能是你在尝试获取TimeSpan对象时所追求的.如果要使用刻度线,则可以使用此TimeSpan的Ticks属性.
或者,您可以使用ElapsedMilliseconds返回long.
| 归档时间: |
|
| 查看次数: |
2543 次 |
| 最近记录: |