获取高精度的时间差,可以用来分析页面运行时间的长短
author:lostinet
from: joycode
datetime.now的精度是很低,这个低的意思是,两次获取的datetime.now的ticks的差,只是一个较大数的整数倍。例如在我的机器上,这个差最小是10.114ms。所以,如果我用datetime.now来计算时间差,那么就无法精确到10ms以内。
后来发现asp.net的trace的精度很高,用reflector看它的实现,发现了它是使用这两个方法的:
参考msdn:how to: time managed code using queryperformancecounter and queryperformancefrequency
我自己了按照这个写了个类,代码如下
using system;
using system.runtime.interopservices;
public class a
{
[dllimport(“kernel32.dll”)]
static extern bool queryperformancecounter([in, out] ref long lpperformancecount);
[dllimport(“kernel32.dll”)]
static extern bool queryperformancefrequency([in, out] ref long lpfrequency);
static long _f = 0;
static public long gettickcount()
{
long f = _f;
if (f == 0)
{
if (queryperformancefrequency(ref f))
{
_f = f;
}
else
{
_f = -1;
}
}
if (f == -1)
{
return environment.tickcount * 10000;
}
long c = 0;
queryperformancecounter(ref c);
return (long)(((double)c) * 1000 * 10000 / ((double)f));
}
//gettickcount()为0时的datetime.ticks值
static long _tc = 0;
//这个返回的不是真正的精确时间,但时间与时间的差是精确的。
//getexactnow与datetime.now的偏差比datetime.now的精度还要小,所以该偏差
static public datetime getexactnow()
{
if (_tc == 0)
{
long tc = gettickcount();
datetime dt = datetime.now;
_tc = dt.ticks – tc;
return dt;
}
return new datetime(_tc + gettickcount());
}
}
在asp。net的应用,可以在global.asax的application_beginrequest事件中加入代码来纪录程序开始时的tickcount:
context.items[“beginrequesttickcount”]=a.gettickcount();
然后在页面输出的后面:
<html>….
<div align=”center”>
<%=new timespan(a.gettickcount()-(long)context.items[“beginrequesttickcount”]).totalmilliseconds%>
</div>
</body></html>
这样就可以达到获取页面运行时间值了。(当然输出totalmilliseconds后asp.net还要一些后期工作的,不过这个时间应该只需要0.n ms)