ASP.NET页面中的时间测量

时间:2009-10-24 23:12:59

标签: asp.net timing

我有一个普通的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);

对我而言,代码看起来非常相似,我似乎无法找出第一种方法无法输出真实结果的原因......

这似乎是在场景后面执行的某种优化问题,但我并没有真正理解它。也许这是由于我个人的时间问题,即睡前问题......

2 个答案:

答案 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处理程序上,得到了完全相同的结果。无论是回复,刷新还是其他什么都无关紧要。

您必须告诉我们发生错误的背景。