2010-04-29 4 views
2

내 코드의 일부분을 실행하는 데 걸린 시간을 확인하기 위해 코드를 프로파일 링하려고합니다.간단한 시간 프로파일 링 - 이상한 시간

내가 포장 한 내 가장 시간이 많이 걸리는 그런 식의 코드의 일부를 :

DateTime start = DateTime.Now; 
... 
... // Here comes the time-consuming part 
... 
Console.WriteLine((DateTime.Now - start).Miliseconds); 

프로그램입니다 초 커플에 대한 코드의이 부분을 실행 (약 20 초)하지만 콘솔 I에서 약 800 밀리 초의 결과를 얻으십시오. 왜 이렇게이다? 내가 도대체 ​​뭘 잘못하고있는 겁니까?

+0

대신 Miliseconds 대신 TotalMiliseconds를 사용하십시오. 현재 가지고있는 방법은 현재의 밀리 초를 보여 주며 오해의 소지가 있습니다. – Justin

답변

8

실제로 TotalMilliseconds 속성을 원하십니까? Milliseconds은 밀리 초 단위의 실제 시간 길이가 아닌 시간 범위의 밀리 초 구성 요소을 반환합니다.

그렇다면 스톱워치를 사용하는 것이 더 정확하기 때문에 (다른 사람들이 말했듯이) 스톱워치를 사용하고 싶을 것입니다.

+0

+1 직접 실제로 질문에 대답;) 이것은 OP가 20k (또는 아마도, 아마도 19800) 대신 800을 얻는 이유입니다 –

+0

그래, 정확히. 어리석은 실수, 고마워! – Gacek

+0

남자 나는 그 질문이 무엇인지 몰랐다. 방금 프로파일 링하는 방법을보고 내 대답을 썼습니다 ... – ChaosPandion

11

Stopwatch 클래스를 사용해보세요. 이 정확한 목적을 위해 만들어진 것입니다.

Stopwatch sw = Stopwatch.StartNew(); 
// ... 
// Here comes the time-consuming part 
// ... 
sw.Stop(); 
Console.WriteLine(sw.ElapsedMilliseconds); 
+0

+1. Stopwatch 수업을 보여 주셔서 감사합니다. 그러나 Zach는 내가 실수 한 곳을 정확히 알려주었습니다. 어쨌든 고마워! – Gacek

+0

@ Gacek : 스톱워치 사용을 권장합니다. "더 빠른"방법을 사용하면 훨씬 더 안정적이고 훨씬 정확합니다. (DateTime 작은 타이밍에 대해 정확하지 않습니다 ...) –

+0

감사합니다, 나는 그것을 확실히 사용합니다 :) – Gacek

3

이것은 코드를 프로파일 링하는 훨씬 좋은 방법입니다.

var result = CallMethod(); // This will JIT the method 
var sw = Stopwatch.StartNew(); 
for (int i = 0; i < 5; i++) 
{ 
    result = CallMethod(); 
} 
sw.Stop(); 
Console.WriteLine(result); 
Console.WriteLine(TimeSpan.FromTick(sw.ElapsedTicks/5)); 
+0

더 나은 첫 번째 반복 계산하지 - 다음 4로 나눕니다. JIT에서 왜곡을 제거합니다. 심지어 더 ... –

0

대신 TotalMilliseconds 속성을 참조하면 원하는 결과를 얻을 수 있습니다. 그러나, 나는 다른 대답이 Stopwatch을 추천하는 것이 더 나은 방법이라고 생각한다.