static void Main()
    {  Stopwatch stopWatch = new Stopwatch();
              stopWatch.Start();
       long c=stopWatch.ElapsedMilliseconds;
        Thread.Sleep(100);
        long  d=stopWatch.ElapsedMilliseconds;
        Console.WriteLine(d-c);        long i=DateTime.Now.Ticks;
        Thread.Sleep(100);
        i-=DateTime.Now.Ticks;
        Console.WriteLine(i/10000);
    }输出的结果是:
100                                                                                                                                                                                  
-118  为什么DateTime.Now.Ticks相差那么大?不是100纳秒吗?

解决方案 »

  1.   

    多试几次
    Thread.Sleep也不是精确的
    你这结果只是运气问题
      

  2.   


    但是第一个相差不会很大,用DateTime.Now.Ticks就相差特大,而msdn上说DateTime.Now.Ticks是100纳秒,也就是千万分之一毫秒,这到底是什么意思?
      

  3.   

    windows是一个多线程多任务系统,不是一个单线程系统。比如说最起码地,就算是.net framework背后的一些操作,也是在其它线程里执行的。在应用程序层没有什么“精准的”Sleep语句。要“精准”,你需要直接写低级的程序。什么.net 框架系统就不用说了,就是windows系统的绝大多数系统服务你甚至都需要绕开不用,才行。
      

  4.   

    如果你的电脑比较先进,且系统支持有专有的高精度计时器,通过 Stopwatch.IsHighResolution 属性可以知道,那么它的Stopwatch计时是比较准确的。但是你的测试程序整体来说都过于简单,什么底层的(例如删除一个目录)之类的工作也不做,什么高级的工作也不做。而复杂的windows程序做不到“精准”地阻塞时间,通常也不去要求误差在10几毫秒以内,所以原始的DateTime类型实现也就没有必要是“精准的”。
      

  5.   

    如果你在教高级的电脑、而又什么都不运行(CPU占用几乎为1%、2%)的情况下测试这么简单的程序,那么你自然得到貌似很准确的Sleep结果。但是如果你运行另外两三个占用内存上百兆、占CPU15%以上的进程,或者你的程序是一个复杂多任务程序,并且你的进程中的线程也不是非常高优先级的,再来看Sleep(并且不要搞100这么大、这么整的数字),就经常会出现误差了。
      

  6.   


    你是在混分吗?老是在教别人逃避问题,你解决不了也就算了,还装出一副高手的样子,这几天来csdn碰到多个你这种人了
    我用多线程时,他洋洋洒洒一大篇,讽刺我在用多线程,还说让我用异步啥的,到最后还是用到了多线程,其实根本不需要知道异步是什么东西,我在网页的在线手册里也没有列出什么异步,但我那个帖子后来解决了问题,每个线程间相隔固定的时间 就是异步了,后来有个2级的网友告诉我autoresetevent 把问题轻松解决了,线程之间切换耗时0毫秒,你当时也在那个帖子,也是说一大堆打击人的话,其实你也不知道autoresetevent这个东西,也是别人发出来了以后才去搜的吧?不然一句话就解决的问题,根本不会说那么多没用的了至于这个问题,我刚才特意下了个鲁大师,温度压力测试,并把100ms改为3ms,结果还是这样的结果明明自己不懂也就算了,还非要装出一副专家的样子,实践证明 你懂个屁的系统?或许你看了一些书,那也是书呆子,没有自己理解
    另外,我从这个月开始学的c#,像什么变量之类的都没细看,用到了再去翻在线手册,以前就看过一些php代码,但是没具体做过东西,我觉得你们这些等级高的人压根和高手不搭边,想想也是,真是高手就不会那么多无用的话了,想让别人尊重你,你得有真材实料,而不是说一些空话,可笑的是 上个帖子里的那个人在不停地教我做人的道理,你跟他完全一个类型的,没真材实料 爱摆臭架子
      

  7.   

    Ticks只是DateTime的一种表现是形式而已,你要问的是DateTime.Now的Precision 。大概读了下下面的文章,作者在他的电脑上测试Precision 大概是16毫秒。想要更精确的使用StopWatch Precision and accuracy of DateTime
    http://blogs.msdn.com/b/ericlippert/archive/2010/04/08/precision-and-accuracy-of-datetime.aspx
      

  8.   

    DateTime.Now的Millisecond都根本不准的
    一直死循环输出当前时间,你会发现很多重复的时间,然后一改变就已经跳过了100ms左右
      

  9.   

      1 2015-06-12 08:46:54.951
      2 2015-06-12 08:46:54.967
    ....
    2051 2015-06-12 08:46:54.967
    2052 2015-06-12 08:46:54.967
    2053 2015-06-12 08:46:54.982
    2054 2015-06-12 08:46:54.982
    ....
    10000 2015-06-12 08:46:54.998
    Start:2015-06-12 08:46:54
    Stop:2015-06-12 08:46:54
    Total:00:00:00.0468750
    实测数据,连毫秒都根本不精确,别说纳秒了
      

  10.   


    你是在混分吗?老是在教别人逃避问题,你解决不了也就算了,还装出一副高手的样子,这几天来csdn碰到多个你这种人了
    我用多线程时,他洋洋洒洒一大篇,讽刺我在用多线程,还说让我用异步啥的,到最后还是用到了多线程,其实根本不需要知道异步是什么东西,我在网页的在线手册里也没有列出什么异步,但我那个帖子后来解决了问题,每个线程间相隔固定的时间 就是异步了,后来有个2级的网友告诉我autoresetevent 把问题轻松解决了,线程之间切换耗时0毫秒,你当时也在那个帖子,也是说一大堆打击人的话,其实你也不知道autoresetevent这个东西,也是别人发出来了以后才去搜的吧?不然一句话就解决的问题,根本不会说那么多没用的了至于这个问题,我刚才特意下了个鲁大师,温度压力测试,并把100ms改为3ms,结果还是这样的结果明明自己不懂也就算了,还非要装出一副专家的样子,实践证明 你懂个屁的系统?或许你看了一些书,那也是书呆子,没有自己理解
    另外,我从这个月开始学的c#,像什么变量之类的都没细看,用到了再去翻在线手册,以前就看过一些php代码,但是没具体做过东西,我觉得你们这些等级高的人压根和高手不搭边,想想也是,真是高手就不会那么多无用的话了,想让别人尊重你,你得有真材实料,而不是说一些空话,可笑的是 上个帖子里的那个人在不停地教我做人的道理,你跟他完全一个类型的,没真材实料 爱摆臭架子
    年轻
      

  11.   


    你是在混分吗?老是在教别人逃避问题,你解决不了也就算了,还装出一副高手的样子,这几天来csdn碰到多个你这种人了
    我用多线程时,他洋洋洒洒一大篇,讽刺我在用多线程,还说让我用异步啥的,到最后还是用到了多线程,其实根本不需要知道异步是什么东西,我在网页的在线手册里也没有列出什么异步,但我那个帖子后来解决了问题,每个线程间相隔固定的时间 就是异步了,后来有个2级的网友告诉我autoresetevent 把问题轻松解决了,线程之间切换耗时0毫秒,你当时也在那个帖子,也是说一大堆打击人的话,其实你也不知道autoresetevent这个东西,也是别人发出来了以后才去搜的吧?不然一句话就解决的问题,根本不会说那么多没用的了至于这个问题,我刚才特意下了个鲁大师,温度压力测试,并把100ms改为3ms,结果还是这样的结果明明自己不懂也就算了,还非要装出一副专家的样子,实践证明 你懂个屁的系统?或许你看了一些书,那也是书呆子,没有自己理解
    另外,我从这个月开始学的c#,像什么变量之类的都没细看,用到了再去翻在线手册,以前就看过一些php代码,但是没具体做过东西,我觉得你们这些等级高的人压根和高手不搭边,想想也是,真是高手就不会那么多无用的话了,想让别人尊重你,你得有真材实料,而不是说一些空话,可笑的是 上个帖子里的那个人在不停地教我做人的道理,你跟他完全一个类型的,没真材实料 爱摆臭架子不怕不懂,怕的是你不懂还不虚心学习
      

  12.   


    你是在混分吗?老是在教别人逃避问题,你解决不了也就算了,还装出一副高手的样子,这几天来csdn碰到多个你这种人了
    我用多线程时,他洋洋洒洒一大篇,讽刺我在用多线程,还说让我用异步啥的,到最后还是用到了多线程,其实根本不需要知道异步是什么东西,我在网页的在线手册里也没有列出什么异步,但我那个帖子后来解决了问题,每个线程间相隔固定的时间 就是异步了,后来有个2级的网友告诉我autoresetevent 把问题轻松解决了,线程之间切换耗时0毫秒,你当时也在那个帖子,也是说一大堆打击人的话,其实你也不知道autoresetevent这个东西,也是别人发出来了以后才去搜的吧?不然一句话就解决的问题,根本不会说那么多没用的了至于这个问题,我刚才特意下了个鲁大师,温度压力测试,并把100ms改为3ms,结果还是这样的结果明明自己不懂也就算了,还非要装出一副专家的样子,实践证明 你懂个屁的系统?或许你看了一些书,那也是书呆子,没有自己理解
    另外,我从这个月开始学的c#,像什么变量之类的都没细看,用到了再去翻在线手册,以前就看过一些php代码,但是没具体做过东西,我觉得你们这些等级高的人压根和高手不搭边,想想也是,真是高手就不会那么多无用的话了,想让别人尊重你,你得有真材实料,而不是说一些空话,可笑的是 上个帖子里的那个人在不停地教我做人的道理,你跟他完全一个类型的,没真材实料 爱摆臭架子
    他不是很好回答你问题了吗,你读不懂sp1234的话,证明你水平不够。
    在csdn能像他这样回帖的几乎没有,人家写那么多,赚你点分有意思吗?
      

  13.   

    跟鲁大师有个毛的关系
    CPU温度跟多少毫秒有一毛钱关系??
      

  14.   


    在上个帖子里不停地教人做人道理的就是你这个垃圾CPU温度跟多少毫秒没有关系?那是你认可的sp1234说的,他说cpu占用一高就影响那个结果,事实证明 cpu占到快100%了都不影响
      

  15.   

    呸,呸,呸,不切实际吗?上个帖子里多线程的问题已经解决了,用了lulianqi说的autoresetevent,很轻松地把问题解决了,事实上你一开始根本不知道autoresetevent,但又要不懂装懂,靠打击别人来找自信而已,不是我看不起你,你这种货色即使学了几年c#,我学一个月就能秒杀你
      

  16.   

    CPU占到100%跟你Thread.Sleep(100);还是Thread.Sleep(500);有一毛钱关系???不讲道理,只会骂人的人,没法沟通
      

  17.   

    除了autoresetevent之外
    还有ManualResetEvent呢我懂还是不懂autoresetevent是一回事,你要不要用100个线程是另一回事算了,跟你没法沟通.我就当被狗咬了吧被狗咬了,回家上药就行了,也没必要再咬狗
      

  18.   

    他不是在一个帖子里打击我了,潜意识其实就是 “我都不会,你一个新手别好高骛远了”,事实上我提出的这些问题,最后都会解决比如前几天的多线程问题,他和Z65443344也在回帖里冷嘲热讽一翻,后来利用lulianqi说的autoresetevent轻而易举解决了
    他不回复我当然可以,回复我了 别说冷嘲热讽,就算骂我作贱我都可以,前提是或多或少的帮助到我,不然我凭什么被他踩脚下?
      

  19.   


    to Z65443344:自己说话前后矛盾,一会儿认同sp1234 ,一会儿又不认同了,我不屑回骂你了,呸
      

  20.   

    说的对的,就认同,说的不对的,就不认同
    而且CPU占有率影响sleep的精度,和sleep影响CPU占有率,是一个问题???有没有逻辑概念啊我说话从来对事不对人
    如果你认为我是在舔sp1234屁股,那也随你
      

  21.   


    就你也配谈素质?呸这是Z65443344在上个帖子里的冷嘲热讽,让我用异步,最后他自己又绕到多线程了,大家可以看看这个人有多恶心,不屑侮辱他,直接就想一口口水吐在他脸上
    http://bbs.csdn.net/topics/391049291
      

  22.   

    什么鲁大师测温度
    谁告诉你CPU占用率高了温度会上升的
    sp1234哪句话说过了,找出来看
      

  23.   


    兄弟啊,知识是无价的,能学到就是赚到,这里的人没有谁敢说自己什么都懂,请教问题放下身段会得到更多人的帮助,新来的被说教几下很正常的,混熟了也不会有人一直这样对你,.net技术更新很快,菜鸟老鸟都要保持持续的学习,纵使老鸟有个别问题没有说对也很正常,但不需要反讽,否则以后只能换个马甲来混了,那时还是得从被人说教开始,何必呢。
      

  24.   

    再说一点,学.net的人我想几乎没有谁没见过sp1234的帖子,很容易就从搜索引擎转到这里来,他热情的回复了那么多的问题,让很多人增长了知识,这一点我对他表示敬意!虽然我过去从不发帖,但也在他那儿学到不少。他在这里的得分很高,从狭义的角度对他个人是否带来些什么好处,我觉得这也是名至实归的,他即使不是最牛的,但从广义的角度讲,他领新人入门的孜孜不倦也值得我们敬佩!
      

  25.   


    你是在混分吗?老是在教别人逃避问题,你解决不了也就算了,还装出一副高手的样子,这几天来csdn碰到多个你这种人了
    我用多线程时,他洋洋洒洒一大篇,讽刺我在用多线程,还说让我用异步啥的,到最后还是用到了多线程,其实根本不需要知道异步是什么东西,我在网页的在线手册里也没有列出什么异步,但我那个帖子后来解决了问题,每个线程间相隔固定的时间 就是异步了,后来有个2级的网友告诉我autoresetevent 把问题轻松解决了,线程之间切换耗时0毫秒,你当时也在那个帖子,也是说一大堆打击人的话,其实你也不知道autoresetevent这个东西,也是别人发出来了以后才去搜的吧?不然一句话就解决的问题,根本不会说那么多没用的了至于这个问题,我刚才特意下了个鲁大师,温度压力测试,并把100ms改为3ms,结果还是这样的结果明明自己不懂也就算了,还非要装出一副专家的样子,实践证明 你懂个屁的系统?或许你看了一些书,那也是书呆子,没有自己理解
    另外,我从这个月开始学的c#,像什么变量之类的都没细看,用到了再去翻在线手册,以前就看过一些php代码,但是没具体做过东西,我觉得你们这些等级高的人压根和高手不搭边,想想也是,真是高手就不会那么多无用的话了,想让别人尊重你,你得有真材实料,而不是说一些空话,可笑的是 上个帖子里的那个人在不停地教我做人的道理,你跟他完全一个类型的,没真材实料 爱摆臭架子
    垃圾就是垃圾 社会底层的人 学了点C#毛皮就洋洋得意 武断的揣测别人的行为 要知道你自己是什么样的货色,你看别人也以为别人像自己一样, 简单的说 就是狗改不了吃屎 小人看谁都是小人!sp1234这人我知道 在社区热心的帮助过很多的人,你有啥资格龇牙,我就是一直潜水的人 今天看到 实在是忍不了
    一个人可以愚蠢 但是不能不尊重知识。至于你的愚蠢问题 Stopwatch 和 DateTime.Now.Ticks 他们的实现原理 有本质上的不同 
    但是有什么样的不同 哈哈 我还真不告诉你 我不是你爹 没责任要教你聪明!
      

  26.   

    test 一下
      

  27.   

    我服了。 才学几个月c#的在这狂喷 还有既然你学c#  不知道有msdn这个东西吗? 你觉得别人说的不精准,你却微软官网教科书似的网站去找答案啊!
      

  28.   

    我居然一楼一楼的看完了
    反正我是感觉那个东西不怎么准的 不过毫秒级别的 感觉还是可信的 精度在高一点 就感觉不可靠了
    你可以试试 windows 的 那两个高精度计时的函数
    http://blog.csdn.net/cloudhsu/article/details/5773043
      

  29.   

    同楼上一样看完了,http://blog.gkarch.com/2015/09/high-resolution-timer.html
      

  30.   

    系统API的Sleep函数说的很清楚,并且是放弃属于这个线程的CPU时间,并且是不精确的
    很明显与CPU当前执行的多任务(线程)调度有关,CPU时间几乎不可能全部分配给你的线程(哪怕你提高线程优先级多运行一会儿也是一样)其实这个问题之前写测试例子的时候就发现了,后来去查了下源代码,根本的区别就是StopWatch用的是性能计数器
    先看下StopWatch的静态构造
    static Stopwatch()
    {
        if (!SafeNativeMethods.QueryPerformanceFrequency(out Frequency))
        {
            IsHighResolution = false;
            Frequency = 0x989680L;
            tickFrequency = 1.0;
        }
        else
        {
            IsHighResolution = true;
            tickFrequency = 10000000.0;
            tickFrequency /= (double) Frequency;
        }
    }Start()
    的时候通过计数器获得实际的Ticks
    if (IsHighResolution)
        {
            long num = 0L;
            SafeNativeMethods.QueryPerformanceCounter(out num);
            return num;
        }
        return DateTime.UtcNow.Ticks;好了,你可以结贴了
     
      

  31.   


    是啊 2年前的帖子都能挖出来 我觉得是 愚蠢&&笨 同时存在.....
      

  32.   


    Public Function GetTickCount() As Integer
            Dim n As Integer
            n = Environment.TickCount
            If n >= 0 Then
                Return n
            Else
                Return n And Int32.MaxValue  '0,1,2,3,-3,-2,0 -> 0,1,2,3,0,1,2,3
            End If
        End Function
    我是这么写的
      

  33.   

    哦,对了,一般系统计算时间的命令误差是系统误差也就是15ms,小于ms的精度需要特殊的指令,一般都是用汇编编写的,可以百度高性能计时器,我用过1个可以误差到2ms
      

  34.   

    https://download.csdn.net/download/hyp429/963629就是这个,以前在vb6里用过他,老外做的,实测能精确到1-2ms