什么是测量时间最有效的方法?

3
我处于这样一种情况,需要每秒执行X次操作(比如刷新PictureBox或从套接字缓冲区中获取字节)。我想知道是否有适当的方法来实现这一点。我做了一些研究,找到了几种方法。
  1. 我可以在while循环中工作,并不断询问操作系统现在的时间,以检查是否已经过去X数量的时间。(DateTime.UtcNow)
  2. 我可以在while循环中工作,并使其休眠一段时间。
  3. 我可以在while循环中工作,并使用Clock类来检查经过的时间。
  4. 使用Timer Class来触发事件。
这些都是我知道的让某些事情定期发生的方法。第二种方法不太精确,但为了完整起见,我把它放在这里。还有其他我应该知道的方法吗?哪种方法的开销最小?
我正在使用VisualStudio 2015 C#和.NET 4.6.1版本。

1
一个Timer就是一个好的Timer,你为什么认为使用它会低效或有问题呢? - Alex K.
我并不是说这种方法不好,我只是想问什么是最好的方法。我将会每秒钟使用这种方法可能达到一百次之多,而且我希望在检查时间方面花费尽可能少的时间。 - Jahith
2个回答

2

使用Stopwatch,它与DateTime.Now相比使用高精度计时器。

DateTime.Now的精度大约为毫秒级别,而Stopwatch则为微秒级别。

// Create new stopwatch.
Stopwatch stopwatch = new Stopwatch();

// Begin timing.
stopwatch.Start();

// Do something.
for (int i = 0; i < 1000; i++)
{
    Thread.Sleep(1);
}

// Stop timing.
stopwatch.Stop();

// Write result.
Console.WriteLine("Time elapsed: {0}", stopwatch.Elapsed);

抱歉让您久等了。我在检查您的解决方案以及它如何适用于我的问题。Stopwatch类似乎不是一个好的选择,因为我无法找到一种稳定地调用其中方法的好方法。例如,实现秒表最简单的方法是定期检查stopwatch.Elapsed是否大于X,如果是,则执行某些操作,然后重置秒表。但这种解决方案暗示着我无法保证长时间保持一致的等待时间。 - Jahith

0

秒表是专门为此目的设计的,是在.NET中测量时间执行的最佳方式之一。

var watch = System.Diagnostics.Stopwatch.StartNew();
/* the code that you want to measure comes here */
watch.Stop();
var elapsedMs = watch.ElapsedMilliseconds;

Console.WriteLine(elapsedMs);

在.NET中不要使用DateTime来测量时间执行。


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