C# 毫秒级定时技术

8
有没有在C#中可以进行亚毫秒精度计时操作的地方?我正在将计时代码放入我的软件中,但所有结果都返回为0ms。我想知道是否有一种方法可以获得更精细的时间粒度。
补充:这是获取亚毫秒计时的正确代码吗?
timeSpan.TotalMilliseconds / 10

我仍然得到0作为经过的时间。

1
你的方法不对,这么短的时间内会受到太多因素的影响,比如JIT、GC、线程上下文切换、其他线程忙等。你应该将问题扩大,对代码进行数千次或数万次迭代,然后计时。 - Lasse V. Karlsen
您可以考虑使用性能分析器。有几个商业选项,也有一个免费的选项,网址为http://www.eqatec.com/tools/profiler。 - TrueWill
5个回答

16

6
自.NET 2.0以来,没有理由使用QueryPerformanceCounter。Stopwatch是内置的并且执行完全相同的功能。两个计时器的频率完全相同。 - Samuel Neff
确实,但他并没有明确说明他在使用.NET 2.0 :) 虽然说话也是,我也没有明确说明它是2.0+,公平起见。 - tyranid
@tyranid,从技术上讲,他并没有明确指定.NET,他只是说了C#。理论上,他可能正在使用其他编译成其他语言的C#编译器之一(我见过一些将其编译为JavaScript和FVM字节码的编译器)。 - Samuel Neff

11

使用 System.Diagnostics.Stopwatch


3
通常情况下,我通过多次重复操作来衡量这些场景(根据需要重复数十次或数百次),以获得几十毫秒的时间。
然后您可以更轻松地进行调整和测量。

1
我学到了新的东西。那些勾号确实很方便。完整示例:
Stopwatch stopwatch = Stopwatch.StartNew();

// Run code to get duration of

long durationInTicks = stopwatch.ElapsedTicks;
Console.WriteLine($"Duration: {(decimal)durationInTicks / TimeSpan.TicksPerMillisecond:f3}ms");

你也可以在 Console.WriteLine 中使用 stopwatch.ElapsedTicks,但我不知道是否会有性能延迟,这就是为什么我首先检索它并将其放入变量中的原因。


1
你可以尝试以Ticks为单位来衡量你的性能,而不是毫秒。这样在性能上会更准确。
但我同意Sam和Tyranid的观点,使用System.Diagnostics.StopWatch。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接