문제
이 질문은 이미 여기에 답이 있습니다.
C#에서 메소드 호출을 벤치마킹하는 방법을 찾고 있습니다.
나는 대학 할당을위한 데이터 구조를 코딩했으며 약간 최적화하는 방법을 생각해 냈지만 모든 상황에서 약간의 오버 헤드를 추가하는 방식으로 o (n) 호출을 o (1)로 바꾸는 방식으로 생각해 냈습니다. 일부.
이제 테스트 데이터에 대해 두 버전을 모두 실행하여 최적화를 구현할 가치가 있는지 확인하고 싶습니다. 루비에서는 벤치 마크 블록으로 코드를 랩핑하고 콘솔에서 블록을 실행하는 데 필요한 시간을 출력하게 할 수 있다는 것을 알고 있습니다. C#에 사용할 수있는 것과 비슷한 것이 있습니까?
해결책
내장을 사용할 수 있습니다 스톱워치 클래스 "경과 시간을 정확하게 측정하는 데 사용할 수있는 일련의 방법과 속성을 제공합니다." 당신이 그것을 할 수있는 방법을 찾고 있다면. 그래도 자동화되지 않습니다.
다른 팁
Yuriy의 답변에서 도난 당하고 수정되었습니다.
private static void Benchmark(Action act, int iterations)
{
GC.Collect();
act.Invoke(); // run once outside of loop to avoid initialization costs
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < iterations; i++)
{
act.Invoke();
}
sw.Stop();
Console.WriteLine((sw.ElapsedMilliseconds / iterations).ToString());
}
특정 방법은 종종 몇 가지 사항을 초기화해야하며 전체 벤치 마크에 초기화 비용을 항상 포함 시키지는 않습니다. 또한 총 실행 시간을 반복 횟수로 나누려면 추정치가 반복 횟수와 무관하거나 무관하게됩니다.
Jon Skeet의 벤치마킹 방법에서 다음을 대부분 훔쳤습니다.
private static void Benchmark(Action act, int interval)
{
GC.Collect();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < interval; i++)
{
act.Invoke();
}
sw.Stop();
Console.WriteLine(sw.ElapsedMilliseconds);
}
시험과 오류로 내가 찾은 것들이 다음과 같습니다.
- (수천) 반복의 첫 번째 배치를 폐기하십시오. 그들은 아마도 지터의 영향을받을 것입니다.
- 별도의 벤치 마크를 실행합니다
Thread
물체는 더 좋고 더 안정적인 결과를 줄 수 있습니다. 왜 그런지 모르겠어요. - 나는 어떤 사람들이 사용하는 것을 보았습니다
Thread.Sleep
벤치 마크를 실행하기 전에 어떤 이유로 든 이것은 상황을 악화시킬뿐입니다. 왜 그런지 모르겠어요. 아마도 지터로 인해. - 디버깅 활성화로 벤치 마크를 실행하지 마십시오. 코드는 대부분의 순서가 느려질 가능성이 높습니다.
- 모든 최적화를 활성화하여 응용 프로그램을 컴파일하십시오. 일부 코드는 최적화에 의해 크게 영향을받을 수 있지만 다른 코드는 그렇지 않으므로 최적화없이 컴파일하면 벤치 마크의 신뢰성에 영향을 미칩니다.
- 최적화와 함께 컴파일 할 때 때때로 벤치 마크의 출력 (예 : 값 인쇄 등)을 어떻게 든 평가해야합니다. 그렇지 않으면 컴파일러는 일부 계산이 쓸모없고 단순히 수행하지 않을 수 있습니다.
- 대의원의 호출은 특정 벤치 마크를 수행 할 때 눈에 띄는 오버 헤드를 가질 수 있습니다. 오버 헤드가 벤치 마크 결과에 거의 영향을 미치지 않도록 대의원에 둘 이상의 반복을 넣는 것이 좋습니다.
- 프로파일 러는 고유 한 오버 헤드를 가질 수 있습니다. 코드의 어떤 부분이 병목 현상인지를 말하는 데 능숙하지만 실제로 두 가지 다른 것을 안정적으로 벤치마킹하는 데 능숙하지 않습니다.
- 일반적으로 멋진 벤치마킹 솔루션은 눈에 띄는 오버 헤드를 가질 수 있습니다. 예를 들어, 하나의 인터페이스를 사용하여 많은 객체를 벤치마킹하려면 클래스에서 모든 객체를 감싸고 싶은 유혹이있을 수 있습니다. 그러나 클래스 생성자는 또한 고려해야 할 오버 헤드가 있음을 기억하십시오. 모든 것을 가능한 한 간단하고 직접적으로 유지하는 것이 좋습니다.
원하는 것 같네요 프로파일 러. 나는 강력하게 추천 할 것이다 EQATEC 프로파일 러 나 자신, 그것은 내가 시도한 최고의 무료입니다. 간단한 스톱워치 1에 대한이 방법에 대한 좋은 점은 특정 방법/블록에 비해 성능의 고장을 제공한다는 것입니다.
프로파일 러는 모든 코드를 진단하기 때문에 최상의 벤치 마크를 제공하지만 속도가 느려집니다. 프로파일 러는 병목 현상을 찾는 데 사용됩니다.
알고리즘을 최적화하려면 병목 현상이 어디에 있는지 알면 이름-> stopwatch 사전을 사용하여 런타임 중에 성능 중요한 섹션을 추적하십시오.