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 ミリ秒未満の場合、DateTime.Now が変更されるまで平均で 7.5 ミリ秒待たなければならないため、まったく時間がかかっていないように見えます。

より正確なタイミングが必要な場合は、(ご存じのように) StopWatch を使用できます。これは、別のより正確な API を使用して結果を取得します。

編集DateTime.NowのMSDN ドキュメントでは、解像度が「約 10 ミリ秒」と示されています。GetTickCount API (同じシステム タイマーを使用する) は、その解像度を「通常は 10 ミリ秒から 16 ミリ秒の範囲」としています。

どうやらそれはハードウェアに依存しているようです。シングル プロセッサ システムは通常 10 ミリ秒、マルチ プロセッサ システムは通常 15 ミリ秒です。

于 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 ..........

ポストバックであっても、ポストバックでなくても... ページを更新したかどうか。

タイミングクラスをどのように使用していますか?

編集

また、上記のコードを Page Load ハンドラーに配置したところ、まったく同じ結果が得られました。それがポストバック、リフレッシュなどであるかどうかは問題ではありません。

エラーが発生しているコンテキストをお知らせください。

于 2009-10-24T23:40:11.007 に答える