구하기 - c# 시간 측정




DateTime.Now는 함수의 성능을 측정하는 가장 좋은 방법입니까? (10)

병목 현상을 발견하고 가능한 측정 시간을 정확하게 파악해야합니다.

다음 코드 스 니펫이 성능을 측정하는 가장 좋은 방법입니까?

DateTime startTime = DateTime.Now;

// Some execution process

DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);

@ Sean Chambers

참고로 .NET Timer 클래스는 진단을위한 것이 아니며 사전 설정된 간격으로 이벤트를 생성합니다 (예 : MSDN ).

System.Timers.Timer aTimer;
public static void Main()
{
    // Create a timer with a ten second interval.
    aTimer = new System.Timers.Timer(10000);

    // Hook up the Elapsed event for the timer.
    aTimer.Elapsed += new ElapsedEventHandler(OnTimedEvent);

    // Set the Interval to 2 seconds (2000 milliseconds).
    aTimer.Interval = 2000;
    aTimer.Enabled = true;

    Console.WriteLine("Press the Enter key to exit the program.");
    Console.ReadLine();
}

// Specify what you want to happen when the Elapsed event is 
// raised.
private static void OnTimedEvent(object source, ElapsedEventArgs e)
{
    Console.WriteLine("The Elapsed event was raised at {0}", e.SignalTime);
}

그래서 이것은 정말로 당신이 어떤 시간이 얼마나 걸렸는지 알지 못하게합니다. 단지 일정한 시간이 지난 것입니다.

타이머는 System.Windows.Forms의 컨트롤로도 노출됩니다 ... VS05 / VS08의 디자이너 도구 상자에서 타이머를 찾을 수 있습니다


Ditto 스톱워치, 방법은 더 좋습니다.

성능 측정과 관련하여 "// 일부 실행 프로세스"가 매우 짧은 과정인지 확인해야합니다.

또한 "// Some Execution Process"의 첫 번째 실행은 후속 실행보다 느릴 수 있음을 명심하십시오.

일반적으로 루프에서 1000 번 또는 1000000 번 실행하여 메서드를 테스트하고 한 번 실행하는 것보다 훨씬 정확한 데이터를 얻습니다.


나는 이런 종류의 성능 검사를 거의하지 않았다. (나는 "느리다"는 것을 생각하는 경향이있다.) 그래서 나는 거의 항상 이걸 가지고 갔다.

Google은 성능 검사를 위해 많은 리소스 / 기사를 공개합니다.

성능 정보를 얻기 위해 pinvoke를 사용하는 것에 대해 많이 언급합니다. 내가 공부하는 자료는 실제로 perfmon을 사용하여 언급 한 것 중 많은 수가 ..

편집하다:

스톱워치의 회담을 보았습니다. 나는 뭔가를 배웠다 :)

이것은 좋은 기사처럼 보입니다.


내 프로그램에서 사용하는 방법은 여기에 표시된 StopWatch 클래스를 사용하는 것입니다.

Stopwatch sw = new Stopwatch();
sw.Start();


// Critical lines of code

long elapsedMs = sw.Elapsed.TotalMilliseconds;

방스 모리슨 (Vance Morrison)의 블로그에 그가 작성한 CodeTimer 클래스 에 대한 StopWatch 사용을보다 쉽게하고 측면에서 깔끔한 것들을 제공하는 게시물을 발견했습니다.


벤치마킹 코드를 유틸리티 클래스 / 메소드로 푸시하는 것이 유용합니다. StopWatch 클래스는 오류 발생시 Disposed 또는 Stopped 일 필요가 없습니다. 그래서, 어떤 행동 을하기위한 가장 간단한 코드는

public partial class With
{
    public static long Benchmark(Action action)
    {
        var stopwatch = Stopwatch.StartNew();
        action();
        stopwatch.Stop();
        return stopwatch.ElapsedMilliseconds;
    }
}

샘플 호출 코드

public void Execute(Action action)
{
    var time = With.Benchmark(action);
    log.DebugFormat(“Did action in {0} ms.”, time);
}

다음은 확장 메소드 버전입니다.

public static class Extensions
{
    public static long Benchmark(this Action action)
    {
        return With.Benchmark(action);
    }
}

그리고 샘플 호출 코드

public void Execute(Action action)
{
    var time = action.Benchmark()
    log.DebugFormat(“Did action in {0} ms.”, time);
}

이것들은 시간을 측정하는 훌륭한 방법이지만 병목 현상을 찾는 간접적 인 방법 일뿐입니다.

스레드에서 bottneck을 찾는 가장 직접적인 방법은 스레드를 실행시키고 기다리는 모든 작업을 수행하는 동안 일시 중지 또는 중단 키로 중지합니다. 이것을 여러 번하십시오. 병목 현상이 X % 시간이 걸리는 경우 X %는 각 스냅 샷의 작업에서이를 잡을 확률입니다.

방법 및 작동 원리에 대한보다 완벽한 설명이 있습니다.


이것은 올바른 방법입니다.

using System;
using System.Diagnostics;

class Program
{
    public static void Main()
    {
        Stopwatch stopWatch = Stopwatch.StartNew();

            // some other code

        stopWatch.Stop();

        // this not correct to get full timer resolution
        Console.WriteLine("{0} ms", stopWatch.ElapsedMilliseconds);

        // Correct way to get accurate high precision timing
        Console.WriteLine("{0} ms", stopWatch.Elapsed.TotalMilliseconds);
    }
}

자세한 내용은 정확한 성능 카운터를 얻으려면 DataTime 대신 스톱워치 사용 을 참조 하십시오 .


stopwatch 기능이 더 우수합니다 (더 높은 정밀도). 나는 또한 가장 인기있는 프로파일 러 중 하나를 다운로드하는 것이 좋습니다. ( DotTraceANTS 는 내가 가장 많이 사용한 것들입니다 ... DotTrace의 무료 평가판은 완전히 기능적이며 일부는 좋아하지 않습니다.)


이 기사에서는 먼저 세 가지 대안 인 Stopwatch , DateTime.NowDateTime.UtcNow 를 비교해야한다고 말합니다.

또한 일부 경우 (성능 카운터가없는 경우) 스톱워치가 DateTime.UtcNow + 일부 추가 처리를 사용하고 있음을 보여줍니다. 그렇기 때문에 DateTime.UtcNow가 최상의 옵션입니다 (다른 처리 + 일부 처리를 사용하기 때문에)

그러나 카운터가 거의 항상 존재 하므로 - 고해상도 성능 카운터 및 .NET Stopwatch와 관련된 존재 여부에 대한 설명을 참조하십시오 . .

다음은 성능 그래프입니다. UtcNow가 대안에 비해 얼마나 낮은 성능을 보는지 주목하십시오.

X 축은 샘플 데이터 크기이고, Y 축은 예제의 상대 시간입니다.

Stopwatch 장점 중 하나는 더 높은 해상도의 시간 측정을 제공한다는 것입니다. 또 다른 것은 OO 특성이다. 그러나 UtcNow 주위에 OO 래퍼를 만드는 것은 어렵지 않습니다.





timer