我有一个普通的asp.net页面,其中包含一些我想测量执行时间的代码。我为此创建了一个非常基本的帮助类:
public class Timing
{
private long m_ticksBefore;
private long m_ticksAfter;
public void Before()
{
m_ticksBefore = DateTime.Now.Ticks;
}
public void After()
{
m_ticksAfter = DateTime.Now.Ticks;
}
public void TraceTime(string note)
{
TimeSpan span = new TimeSpan(m_ticksAfter - m_ticksBefore);
System.Diagnostics.Trace.Write(string.Format("\n...Timing for {0}...\nTicks: \t{1}\nMilliseconds: \t{2}\nSeconds: \t{3}\n..................", note, span.Ticks, span.TotalMilliseconds, span.TotalSeconds));
}
}
我实例化一个新的Timing对象,并使用Before()和After方法包装我希望监视的代码,最后调用TraceTime()方法,以便将结果输出到IDE中的输出窗口。
奇怪的是,对页面的第一个请求导致预期的时间结果大约40毫秒,但刷新页面(F5)给我0个执行时间滴答。即使执行具有新参数的页面,强制在受监视区域内执行不同代码,也会显示出平坦的0。
如果我使用System.Diagnostics.StopWatch,我会得到更实际的结果
Stopwatch watch1 = Stopwatch.StartNew();
//Some code to monitor
watch1.Stop();
System.Diagnostics.Trace.Write(watch1.ElapsedTicks);
对我而言,代码看起来非常相似,我似乎无法找出第一种方法无法输出真实结果的原因......
这似乎是在场景后面执行的某种优化问题,但我并没有真正理解它。也许这是由于我个人的时间问题,即睡前问题......
答案 0 :(得分:1)
虽然DateTime.Now的分辨率似乎为100ns,但Windows实际上每15ms只更新一次内部时钟。因此,如果您的代码运行时间少于约7.5毫秒,则它似乎根本没有时间,因为平均而言,您必须等待7.5毫秒才能更改DateTime.Now。
如果您需要更准确的计时,您可以(如您所见)使用StopWatch。这会使用不同的,更准确的API来获得结果。
编辑 MSDN documentation for DateTime.Now的分辨率为“大约10毫秒”。 GetTickCount API(使用相同的系统计时器)使其分辨率“通常在10毫秒到16毫秒的范围内”。
显然它依赖于硬件 - 单处理器系统通常为10ms,多处理器系统通常为15ms。
答案 1 :(得分:0)
我没有遇到和你一样的问题。 我将以下代码放在按钮单击事件上:
Timing timing = new Timing();
timing.Before();
for (int i = 0; i < 100; i++)
Thread.Sleep(1);
timing.After();
// I altered TraceTime to receive a HttpResponse.
timing.TraceTime("this is a note", this.Response);
响应始终接近:
...这个时间是一个注释......蜱虫: 1000057毫秒:100,0057 秒:0,1000057 ..................
无论是回帖还是回帖...如果我刷新了页面。
你是如何使用Timing课程的?
修改强>
我还将上面的代码放在Page Load处理程序上,得到了完全相同的结果。无论是回复,刷新还是其他什么都无关紧要。
您必须告诉我们发生错误的背景。