C#学习教程:.NETSystem.Diagnostics.Stopwatch问题(返回值过低)低的。例如,当我指定Thread.Sleep(1000)时为200毫秒。该程序应等待1秒。我还使用ManualResetEvent.WaitOne(1000)进行了测试并得到了相同的结果。框架2.0和3.0都给出了这种奇怪的行为。我正在运行带有.NETFramework3.5SP1的WindowsXPSP3。这是我的测试结果(下面的代码):1000msforDateTime.Now.Ticks0201msforStopwatch.ElapsedTicks0142msforStopwatch.ElapsedMilliseconds0139msforStopwatch.ElapsedTicksafterReset0264msforStopwatch.ElapsedTickssettingThread15msStopwatch.ElapsedTicks设置ProcessorAffinity(以及更多)0371msStopwatch.ElapsedTicks与同步对象完成!//Program.cs文件classProgram{staticvoidMain(string[]args){StopWatchTest.Go();Console.WriteLine("完成!");控制台.ReadLine();}}//StopWatchTest.cs类internalstaticclassStopWatchTest{publicconstintSleepTime=1000;publicstaticvoidGo(){#regionTest#0withDateTime.Now.TickslongstartTick=DateTime.Now.Ticks;Thread.Sleep(睡眠时间);longstopTick=DateTime.Now.Ticks;longelapsedDt=(stopTick-startTick)*100;显示((int)(elapsedDt/1000/1000),“DateTime.Now.Ticks”);#endregionTest#0withDateTime.Now.TicksStopwatchwatch=Stopwatch.StartNew();长频率=Stopwatch.Frequency;双nanosecPerTick=(1000.0*1000.0*1000.0)/频率;#regionTest#1withStopwatch.ElapsedTicksstartTick=watch.ElapsedTicks;Thread.Sleep(睡眠时间);stopTick=watch.ElapsedTicks;doubleelapsedSw=(stopTick-startTick)*nanosecPerTick;显示((int)(elapsedSw/1000/1000),"Stopwatch.ElapsedTicks");#endregionTest#1withStopwatch.ElapsedTicks#regionTest#2withStopwatch.ElapsedMillisecondsstartTick=watch.ElapsedMilliseconds;Thread.Sleep(睡眠时间);stopTick=watch.ElapsedMilliseconds;显示((int)(stopTick-startTick),“秒表。ElapsedMilliseconds”);#endregionTest#2withStopwatch.ElapsedMilliseconds#regionTest#3withStopwatch.ElapsedTicksafterResetwatch.Stop();手表.重置();观看。开始();startTick=watch.ElapsedTicks;Thread.Sleep(睡眠时间);stopTick=watch.ElapsedTicks;elapsedSw=(stopTick-startTick)*nanosecPerTick;显示((整数)(经过的时间/1000/1000),"Stopwatch.ElapsedTicksafterReset");#endregionTest#3withStopwatch.ElapsedTicks重置后#regionTest#4withStopwatch.ElapsedTicksandThreadAffinityThread.BeginThreadAffinity();startTick=watch.ElapsedTicks;Thread.Sleep(睡眠时间);stopTick=watch.ElapsedTicks;elapsedSw=(stopTick-startTick)*nanosecPerTick;Display((int)(elapsedSw/1000/1000),"Stopwatch.ElapsedTicks设置ThreadAffinity");Thread.EndThreadAffinity();#endregionTest#4withStopwatch.ElapsedTicksandThreadAffinity#regionTest#5withStopwatch.ElapsedTicksandProcessorAffinity(andmore)constintaffinity=0x0001;进程proc=Process.GetCurrentProcess();proc.ProcessorAffinity=newIntPtr(affinity);proc.PriorityClass=ProcessPriorityClass.High;ProcessThreadCollectionptc=proc.Threads;foreach(ProcessThreadptinptc){pt.IdealProcessor=0;pt.ProcessorAffinity=newIntPtr(affinity);}Thread.CurrentThread.Priority=威胁dPriority.Highest;startTick=watch.ElapsedTicks;Thread.Sleep(睡眠时间);stopTick=watch.ElapsedTicks;elapsedSw=(stopTick-startTick)*nanosecPerTick;Display((int)(elapsedSw/1000/1000),"Stopwatch.ElapsedTickssettingProcessorAffinity(andmore)");#endregion测试#5使用ProcessorAffinity和更多#region测试#6使用同步对象elapsedSw=newSyncTimer().Go();Display((int)(elapsedSw/1000/1000),"Stopwatch.ElapsedTickswithSyncronizedobject");#endregion测试#6与同步对象}}[同步]内部类SyncTimer:ContextBoundObject{[MethodImpl(MethodImplOptions.Synchronized)]publicdoubleGo(){Stopwatch.StartNew();长频率=Stopwatch.Frequency;双nanosecPerTick=(1000.0*1000.0*1000.0)/频率;longstartTick=Stopwatch.GetTimestamp();吨hread.Sleep(StopWatchTest.SleepTime);longstopTick=Stopwatch.GetTimestamp();返回(stopTick-startTick)*nanosecPerTick;查看此链接:https://connect.microsoft.com/VisualStudio/feedback/details/94083/stopwatch-returns-negative-elapsed-timeSystem.Diagnostics.Stopwatch在Elapsed...属性中返回负数秒表精度似乎有问题,这可能导致它返回负的经过时间,如果你看一下连接问题,时间也会有很大的变化,那里的大多数人都在谈论看到这个问题在虚拟机上,这就是我们看到负Elapsed值问题的地方。查看QueryPerformanceCounter文档,似乎暗示此问题可能由于BIOS或硬件抽象层错误而发生在多处理器系统上,但没有提供进一步的信息,也没有指定虚拟机。至于这个问题的解决方案......我在谷歌搜索中找不到。您可以忽略小于零的值,这在某些情况下并不理想但有效。但这并不能解决你的问题——你怎么知道哪些值是无效的?希望这个对你有帮助。我知道这是一个老问题,但我想在遇到同样的问题后我会提供我的2美分:我开始按照@AllonGuralnek的建议查看频率,它确实以秒为单位给出了准确的时间,但它减少了剩余的毫秒数我想捕捉。无论如何,经过多次来回,但没有得到任何密钥,我注意到sw.Elapsed有一个Ticks属性,这个属性给了我确切的滴答数,一旦转换回来,它给了我一个准确的时间。在代码方面,这就是我最终得到的:Stopwatchsw=newStopwatch();sw.开始();...做工作sw.Stop();longelapsedTicks=sw.Elapsed.Ticks;Debug.WriteLine(TimeSpan.FromTicks(elapsedTicks).ToString());运行测试时,调用:虽然我可能遗漏了一些东西,但我认为sw.ElaspedTicks返回的值与sw.Elapsed.Ticks不同是没有意义的,所以如果有人想知道一些关于这个的事情,请做,但是从我的角度来看,我认为这是一个错误,如果不是,至少感觉很不一致!注意:调用sw.ElapsedTicks/Stopwatch.Frequency返回11(即秒),但正如我所说,它会减少毫秒数,这对我不起作用。我了解了:1000msforDateTime.Now.Ticks0999msforStopwatch.ElapsedTicks1000毫秒用于秒表。ElapsedMilliseconds0999毫秒用于秒表。重置后的ElapsedTicks0999毫秒用于秒表。ElapsedTicks设置ThreadAffinity0999毫秒用于秒表。ElapsedTicks设置ProcessorAffinity(以及更多)(无法运行上次测试)在四核i7机器上在Linqpad中使用.NET4。我只倾向于使用Stopwatch.ElapsedMilliseconds,但我从未见过任何奇怪的东西。听起来有点像您的机器或虚拟化平台。在某些情况下,您似乎在使用Tick计数。请记住,在现代Windows上,操作系统默认会节省CPU。这意味着滴答计数和经过的时间不是线性比例的。我建议您尝试使用最基本形式的Stopwatch.ElapsedMilliseconds:varsw=newStopwatch();sw.开始();线程.睡眠(1000);varelpased=sw.Elapsed;在Windows上使用QueryPerformanceCounter。在http://www.windojitsu.com/code/hirestimer.cs.html查看这个小类您可以使用该代码修复“Stopwatch.Elapsed”方法问题:usingSystem;使用系统诊断;命名空间总部。Util.General{publicstaticclassStopWatchExtension{publicstaticTimeSpanToTimeSpan(thisStopwatchstopWatch){returnTimeSpan.FromTicks(stopWatch.ElapsedTicks);}}}用法:使用HQ.Util.General;Debug.Print($"经过的毫秒数:{stopWatch.ToTimeSpan().TotalMilliseconds}");我相信你会在这里找到答案:http://social.msdn.microsoft.com/Forums/en-US/netfxbcl/thread/eec73d6e-f597-4342-be48-5d2ce30202f0/但更多细节和解释见:http//msdn.microsoft.com/en-us/magazine/cc163996.aspxhttp://stackoverflow.com/questions/394020/stopwatch-accuracyhttp://msdn.microsoft.COM/EN-US/library/system.diagnostics.stopwatch.aspx以上就是C#学习教程的全部内容:.NETSystem.Diagnostics.Stopwatchproblem(返回值太低),如果有兴趣的话很有用,需要详细了解C#学习教程.希望大家多多关注。本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:
