【问题标题】:Time measurement in ASP.NET pageASP.NET 页面中的时间测量
【发布时间】:2009-10-24 23:12:58
【问题描述】:

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

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

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

【问题讨论】:

    标签: asp.net timing


    【解决方案1】:

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

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

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

    显然它取决于硬件 - 单处理器系统通常为 10 毫秒,多处理器系统通常为 15 毫秒。

    【讨论】:

    • 问题是相同的编码在一种情况下需要 40 毫秒,而在另一种情况下需要 0 ......当然,正在测量的代码在回发场景中可能会有不同的反应,但他没有提到.
    • 我的意思是它实际上并没有花费 0 毫秒。这仍然是一个相当大的下降,但 ~40ms 到
    • 使用秒表进行的另一次测试运行显示支持此答案的结果(测试运行和时间以毫秒为单位):1 58.2637 2 1.2936 3 1.3542 4 1.3925 … … 20 0.9812 21 1.033 22 1.0951 23 0.9684 24 0.9684 24 0.31 2667。 0.9808 谢谢你的回答。我正在继续使用秒表,因为我现在没有时间进一步调查。谢谢!
    • 真的很烦你没有更好的 cmets 编辑器.. 很难阅读上面的测试结果,抱歉
    • 如果您可以为您的答案提供来源(msdn 文章等),那就太好了:)
    【解决方案2】:

    我没有遇到和你一样的问题。 我将以下代码放在按钮单击事件上:

    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 类的?

    编辑

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

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

    【讨论】:

    • 与您在示例中所做的完全相同。
    • 代码被添加到页面加载处理程序中,与您的示例完全相同。第一次在调试模式下点击页面时,我会在输出窗口中显示一个合理的值。如果我重新加载页面(使用 F5 或 ctrl+F5),我会得到 0 个滴答声。它很奇怪......
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多