我做了一个用以在记录文件中写入自定义的调试信息(主要是时间差)的类,见:http://blog.csdn.net/sswv/主要思想是
Long t1 = DateTime.Now.Ticks;
Long t2 = DateTime.Now.Ticks;
Long sp = t2 - t1;但我发现这种记录时间的精度为10.0144毫秒,也就是说所有记录的时间是10.0144毫秒的倍数,小于10.0144毫秒的部分记为0,比如6毫秒记为0,25毫秒记为20.0288毫秒。请问如何记录精确到1毫秒的时间差?

解决方案 »

  1.   

    不要用long,直接取2时间的差(也不要用Ticks)。虽然应该也到不了1毫秒的精度,但是不至于到10毫秒以上才对。
    越需要精确的地方越不要转换类型。
      

  2.   

    Ticks的类型就是Long呀?不会损失精度吧。
    不要用Ticks,用什么好?用TimeSpan输出也得转化为Ticks或Millisecond呀?
    用Environment.TickCount也一样。
      

  3.   

    http://blog.joycode.com/lostinet/archive/2005/04/24/49590.aspx
      

  4.   

    DateTime.Now.Millisecond
    用这个就可以了。
      

  5.   

    试过NN次后,我“也”发现这种记录时间的精度为10.0144毫秒,
    看来,这个问题是由CLR决定的,如果,只使用FCL的函数,看来没办法解决这一问题了!看了  LoveCherry(论成败,人生豪迈;大不了,重头再来!^_^)  ,给出的文章链接,
    http://blog.joycode.com/lostinet/archive/2005/04/24/49590.aspx受了些启发,对于文章中实现的那个A类,我没看太明白,但是,文章中用到了QueryPerformanceCounterp这个win API函数,楼主,可以导入用一下,我试过多次,在我的机子上,其精度为 210/1000 毫秒左右。QueryPerformanceCounter这个函数的是一个计数器函数,以百万分之一秒为单位,来记算时间数。
    //=============
    using System.Runtime.InteropServices;
    using System.Threading;[DllImport("kernel32.dll")]
    static extern bool QueryPerformanceCounter([In, Out] ref long lpPerformanceCount);long t1 = 0;
    long t2 = 0;
    QueryPerformanceCounter(ref t1);
    Thread.Sleep(1); //挂起一毫秒,作为演示
    QueryPerformanceCounter(ref t2);long sp = t2 - t1;//sp的单位为百万分之一秒float f_time = (float)((decimal) sec / (decimal)10000); //得到0.0001毫秒的精度f_time = float.Parse(string.Format("{0:F1}",f_time)); //f_time是经过四舍五入,得到的0.1毫秒的精度
      

  6.   

    再说一句,windows系统,不是实时系统,对于毫秒级的精度,并不能保证十分地准确!
      

  7.   

    我想楼主在走极端,研究极限问题了。
    我觉得,现在的系统,不论Unix还是Windows,使用的是何种cpu,intel or amd or other,系统设计时没有考虑过紧缺到1毫秒的处理,因为实际中不会用到,因为计算机工作需要各个部件协同工作,最慢的决定速度,即使cpu可以处理1毫秒,其他部件不见得跟得上这种速度,况且现在使用的都是高级操作系统,如果使用低级些的,比如用汇编操作某个寄存器,模拟写日志,也许能够接近1毫秒,能够打到,不测试谁也没把握,而高级系统要处理的操作更多,更费时。微软定义的Timer,在win2000下,即使将interval设为1毫秒,那么时间也会为10毫秒左右,这是能处理的最小值了。
    对于物理学,讨论我们生活的世界,牛顿定律可以了,但是讨论微观世界,还是用量子理论。
    如果楼主坚持研究1毫秒操作,恐怕要用其它知识了。
      

  8.   

    刚才注释错了一句:
    float f_time = (float)((decimal) sec / (decimal)10000); //得到0.0001毫秒的精度
    将注释改为: //得到0.1毫秒的精度 //============================================================
    如果作者是想得到1毫秒的精度,如下:
    //得到1毫秒的精度
    decimal d_time = decimal.Round((decimal) sec / (decimal)10000, 0);