我做了一个用以在记录文件中写入自定义的调试信息(主要是时间差)的类,见: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毫秒的时间差?
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毫秒的时间差?
越需要精确的地方越不要转换类型。
不要用Ticks,用什么好?用TimeSpan输出也得转化为Ticks或Millisecond呀?
用Environment.TickCount也一样。
用这个就可以了。
看来,这个问题是由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毫秒的精度
我觉得,现在的系统,不论Unix还是Windows,使用的是何种cpu,intel or amd or other,系统设计时没有考虑过紧缺到1毫秒的处理,因为实际中不会用到,因为计算机工作需要各个部件协同工作,最慢的决定速度,即使cpu可以处理1毫秒,其他部件不见得跟得上这种速度,况且现在使用的都是高级操作系统,如果使用低级些的,比如用汇编操作某个寄存器,模拟写日志,也许能够接近1毫秒,能够打到,不测试谁也没把握,而高级系统要处理的操作更多,更费时。微软定义的Timer,在win2000下,即使将interval设为1毫秒,那么时间也会为10毫秒左右,这是能处理的最小值了。
对于物理学,讨论我们生活的世界,牛顿定律可以了,但是讨论微观世界,还是用量子理论。
如果楼主坚持研究1毫秒操作,恐怕要用其它知识了。
float f_time = (float)((decimal) sec / (decimal)10000); //得到0.0001毫秒的精度
将注释改为: //得到0.1毫秒的精度 //============================================================
如果作者是想得到1毫秒的精度,如下:
//得到1毫秒的精度
decimal d_time = decimal.Round((decimal) sec / (decimal)10000, 0);