[C#] DateTime.Now가 함수의 성능을 측정하는 가장 좋은 방법입니까?

병목 현상을 찾아야하며 가능한 측정 시간을 정확하게 측정해야합니다.

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

DateTime startTime = DateTime.Now;

// Some execution process

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



답변

아뇨. 스톱워치 사용 (에서 System.Diagnostics)

Stopwatch sw = Stopwatch.StartNew();
PerformWork();
sw.Stop();

Console.WriteLine("Time taken: {0}ms", sw.Elapsed.TotalMilliseconds);

스톱워치는 고정밀 타이머가 있는지 자동으로 확인합니다.

시간대, DST 등 으로 수행 해야하는 작업으로 인해 DateTime.Now종종 속도가 약간 느리다는 것을 언급 할 가치가 DateTime.UtcNow있습니다 .

DateTime.UtcNow의 해상도는 일반적으로 15ms입니다. 자세한 내용 은 정밀도에 대한 John Chapman의 블로그 게시물을 참조하십시오 DateTime.Now.

재미있는 퀴즈 : DateTime.UtcNow하드웨어가 고주파수 카운터를 지원하지 않으면 스톱워치가 다시 사용됩니다 . 정적 필드 Stopwatch.IsHighResolution 을 보면 Stopwatch가 하드웨어를 사용하여 고정밀도를 달성하는지 확인할 수 있습니다 .


답변

빠르고 더러운 것을 원한다면 스톱워치를 사용하여 정밀도를 높이는 것이 좋습니다.

Stopwatch sw = new Stopwatch();
sw.Start();
// Do Work
sw.Stop();

Console.WriteLine("Elapsed time: {0}", sw.Elapsed.TotalMilliseconds);

또는 좀 더 정교한 것이 필요한 경우 ANTS 와 같은 타사 프로파일 러를 사용하는 것이 좋습니다 .


답변

이 기사에서는 우선 세 가지 대안 Stopwatch, DateTime.NowAND 를 비교해야한다고 말합니다 DateTime.UtcNow.

또한 스톱워치가 DateTime.UtcNow + 일부 추가 처리를 사용하는 경우도 있습니다 (성능 카운터가 존재하지 않는 경우). 이 경우 DateTime.UtcNow가 가장 좋은 옵션이라는 것이 분명합니다 (다른 사용 + 일부 처리 때문에)

그러나 결과적으로 카운터는 거의 항상 존재합니다. 고해상도 성능 카운터 및 .NET 스톱워치와 관련된 존재에 대한 설명은 무엇입니까? .

성능 그래프는 다음과 같습니다. 저비용 성능 UtcNow가 다른 제품과 비교 한 결과를 확인하십시오.

여기에 이미지 설명을 입력하십시오

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

Stopwatch더 좋은 점 은 더 높은 분해능 시간 측정을 제공한다는 것입니다. 다른 하나는 더 많은 OO 특성입니다. 그러나 OO 래퍼를 만드는 UtcNow것은 어렵지 않습니다.


답변

벤치마킹 코드를 유틸리티 클래스 / 방법으로 푸시하는 것이 유용합니다. 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);
}


답변

스톱워치 기능이 더 나은 (고정밀도) 일 것이다. 나는 또한 비록 (그냥 인기 프로파일 중 하나를 다운로드하는 것이 좋습니다 것 DotTrace개미는 내가 가장을 사용했던 사람이 … DotTrace의 무료 평가판 완벽하게 작동하고, 다른 사람의 일부처럼 잔소리하지 않습니다).


답변

System.Diagnostics.Stopwatch 클래스를 사용하십시오.

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

// Do some code.

sw.Stop();

// sw.ElapsedMilliseconds = the time your "do some code" took.


답변

디토 스톱워치, 더 나아졌습니다.

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

또한 “// 일부 실행 프로세스”의 첫 번째 실행은 후속 실행보다 느릴 수 있습니다.

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