구하기 - c# 시간 측정
DateTime.Now는 함수의 성능을 측정하는 가장 좋은 방법입니까? (10)
병목 현상을 발견하고 가능한 측정 시간을 정확하게 파악해야합니다.
다음 코드 스 니펫이 성능을 측정하는 가장 좋은 방법입니까?
DateTime startTime = DateTime.Now;
// Some execution process
DateTime endTime = DateTime.Now;
TimeSpan totalTimeTaken = endTime.Subtract(startTime);
참고로 .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
, DateTime.Now
및 DateTime.UtcNow
를 비교해야한다고 말합니다.
또한 일부 경우 (성능 카운터가없는 경우) 스톱워치가 DateTime.UtcNow + 일부 추가 처리를 사용하고 있음을 보여줍니다. 그렇기 때문에 DateTime.UtcNow가 최상의 옵션입니다 (다른 처리 + 일부 처리를 사용하기 때문에)
그러나 카운터가 거의 항상 존재 하므로 - 고해상도 성능 카운터 및 .NET Stopwatch와 관련된 존재 여부에 대한 설명을 참조하십시오 . .
다음은 성능 그래프입니다. UtcNow가 대안에 비해 얼마나 낮은 성능을 보는지 주목하십시오.
X 축은 샘플 데이터 크기이고, Y 축은 예제의 상대 시간입니다.
Stopwatch
장점 중 하나는 더 높은 해상도의 시간 측정을 제공한다는 것입니다. 또 다른 것은 OO 특성이다. 그러나 UtcNow
주위에 OO 래퍼를 만드는 것은 어렵지 않습니다.