병목 현상을 찾아야하며 가능한 측정 시간을 정확하게 측정해야합니다.
다음 코드 스 니펫이 성능을 측정하는 가장 좋은 방법입니까?
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.Now
AND 를 비교해야한다고 말합니다 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 번 실행하여 메소드를 테스트하고 한 번 실행하는 것보다 훨씬 정확한 데이터를 얻습니다.