当前位置: 代码迷 >> C# >> 请问高人关于 C# 时间精确度的有关问题
  详细解决方案

请问高人关于 C# 时间精确度的有关问题

热度:534   发布时间:2016-05-05 05:35:22.0
请教高人关于 C# 时间精确度的问题?
本帖最后由 linxi0093 于 2014-12-13 17:15:18 编辑
我想用精确的时间计算,需要精确到毫秒级别,代码运行后发下有误差。请教高人怎么实现。

static System.Diagnostics.Stopwatch stw = new System.Diagnostics.Stopwatch();
static int testNum = 0;
stw.Start();
while (true)
{
      System.TimeSpan startTime = stw.Elapsed;

      if (testNum % 100 == 0)
       {

             //TODO do something

             Console.WriteLine(string.Format("循环{0}次,用时{1}秒。\r\n", testNum, stw.Elapsed.TotalSeconds));
        }

        while ((stw.Elapsed - startTime).TotalMilliseconds <= 10)
         {
                System.Threading.Thread.Sleep(5);
          }
         testNum++;
}

结果如图:

------解决思路----------------------
要精确到毫秒,可以用StopWatch类,或者用GetTickCount API

前者msdn自己查,后者参考
http://www.cnblogs.com/jxsoft/archive/2011/10/17/2215366.html
------解决思路----------------------
不知道楼主要实现什么功能,如果是要精确的控制代码执行的时机和时间的话,我觉得楼主需要一个实时操作系统,windows不适合你,至少标准的windows不适合
------解决思路----------------------
到底什么样的需求需要严格的10毫秒执行一次?这种级别的时间经度和cpu时钟有很大关系了,1楼版主的给你的方法可以精确计时(高精度下也和cpu时钟相关),但并不可以控制时间。你最好考虑下你的需求是否真的需要10毫秒精度。即便你间隔时间内保证,你的代码执行时间是否能每次精确在毫秒级内完成?
------解决思路----------------------
windows系统定时器精度默认是15.625ms,所以一般的办法不行。想要到10ms或者更高的精度需要通过api调整系统定时器到1ms精度,然后使用Socket.Poll来等待,这是能找到的最精确的方式,但是因为操作系统本身非实时,最后真正要每隔10ms执行任务估计很困难。所以最好先想想需求的必要性,再尝试实现。
------解决思路----------------------
引用:
引用
不知道楼主要实现什么功能,如果是要精确的控制代码执行的时机和时间的话,我觉得楼主需要一个实时操作系统,windows不适合你,至少标准的windows不适合

我要实现的是每10毫秒运行一次代码(准备写在//TODO do something,现在还没完成),这个应该不需要实时操作系统来实现吧。


windows不是“实时操作系统”,定时器误差在50毫秒都是正常的。
------解决思路----------------------
windows不是“实时操作系统”  -->    windows桌面或者服务器版不是“实时操作系统”

要纠结定时中断的“误差”,那你应该使用工业控制使用windows版。
------解决思路----------------------
引用:
windows系统定时器精度默认是15.625ms,所以一般的办法不行。想要到10ms或者更高的精度需要通过api调整系统定时器到1ms精度,然后使用Socket.Poll来等待,这是能找到的最精确的方式,但是因为操作系统本身非实时,最后真正要每隔10ms执行任务估计很困难。所以最好先想想需求的必要性,再尝试实现。


如果这么干了,电脑上别的大量应用程序的性能会大大降低。windows上跑的是大量复杂的应用,同一时间有上千个线程进行抢先多任务调度,操作系统也很复杂。它不是只有几个非常简单的进程,它不能过分地修改定时器精度。
  相关解决方案