1

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

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

这似乎是在幕后执行的某种优化问题,但我真的不明白。也许是由于我个人的时间问题,即就寝时间问题......

4

2 回答 2

1

尽管 DateTime.Now 看起来有 100ns 的分辨率,但 Windows 实际上只每 15ms 更新一次其内部时钟。因此,如果您的代码运行时间少于 7.5 毫秒,那么它似乎根本不需要时间,因为平均而言,您必须等待 7.5 毫秒才能更改 DateTime.Now。

如果您需要更准确的计时,您可以(如您所见)使用 StopWatch。这使用不同的、更准确的 API 来获得结果。

编辑DateTime.Now的MSDN 文档将分辨率设为“大约 10 毫秒”。GetTickCount API(使用相同的系统计时器)将其分辨率定义为“通常在 10 毫秒到 16 毫秒的范围内”。

Apparently it's hardware dependent - single processor systems are typically 10ms, multiple processor systems are typically 15ms.

于 2009-10-25T00:23:52.803 回答
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 课程?

编辑

我还将上面的代码放在页面加载处理程序上,并得到了完全相同的结果。无论是回发,刷新还是其他什么都没有关系。

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

于 2009-10-24T23:40:11.007 回答