Microsoft MVP성태의 닷넷 이야기
Stopwatch.ElapsedTicks와 Stopwatch.ElapsedMilliseconds [링크 복사], [링크+제목 복사],
조회: 23298
글쓴 사람
나나
홈페이지
첨부 파일
 
(연관된 글이 2개 있습니다.)

'시작하세요! C# 7.1 프로그래밍'으로 공부하고 있습니다.
 375쪽 Stopwatch를 정리하던 도중에 ElapsedTicks로 밀리초와 초를 나타내셨더라구요.
Stopwatch에는 ElapsedTicks말고도 ElapsedMilliseconds도 있길래 단위만 다르게 표현하는 프로퍼티정도로 생각했습니다.
근데 알고리즘을 측정해서 ElapsedTicks와 ElapsedMilliseconds와 비교했더니 값이 전혀 다르더라구요.
ElapsedMilliseconds와 Stopwatch.Elapsed.TotalMilliseconds가 비슷하고 ElapsedTicks는 Stopwatch.Frequency와 비슷하더군요.
Stopwatch.Frequency가 자신의 컴퓨터가 초당 몇 틱을 측정할 수 있는지 알려주는 필드인데 DateTime에서 배웠던 100ns를 나타내는 Ticks 프로퍼티와 Stopwatch에서 말하는 Ticks는 다른 의미인 것 같습니다.
저는 ElapsedTicks 값과 Stopwatch.Frequency가 같을 수록 1초에 가깝다는 의미이므로 375쪽에서 설명한 것처럼 단순히 (ElapsedTicks / 10000)으로 밀리초를 나타낼 수 없고 1000으로 더 나눈다고 해서 초로 나타낼 수 없다고 생각합니다.
이를 어떻게 이해야하는지, 밀리초로 표현하는 다른 방법이 있는지 궁금합니다.

이 아래는 제가 쓴 코드이며 환경은 비주얼 스튜디오 2017, 닷넷 4.7.1입니다.

private static long Sum() // 그냥 측정용 메소드
{
    long sum = 0;

    for (int i = 0; i < 500000000; ++i)
        sum += i;

    return sum;
}

public static void Main()
{
    Stopwatch st = new Stopwatch();

    st.Start(); // 알고리즘을 시작하기 전 스탑워치를 킨다.
    Sum(); // 알고리즘을 돌린 후
    st.Stop(); // 알고리즘을 돌린 후 스탑워치를 정지한다.

    Console.WriteLine("Millisecond : " + st.ElapsedMilliseconds); // 밀리초로 나타낸다.
    Console.WriteLine("Millisecond : " + st.Elapsed.TotalMilliseconds); // 밀리초를 double로 나타낸다.
    Console.WriteLine("Total Ticks : " + st.ElapsedTicks); // 시간이라기보다 측정 틱 수인거같은데?
    Console.WriteLine("second : " + Stopwatch.Frequency); // 내 컴퓨터가 초당 몇 틱을 측정할 수 있는지 알려줌
}


[연관 글]






[최초 등록일: ]
[최종 수정일: 7/25/2018]


비밀번호

댓글 작성자
 



2018-07-25 10시19분
말씀하신데로 10000 * 1000으로 나누는 것이 정확하지 않을 수 있습니다. 정확하게는 해당 코드는 다음과 같이 바뀌어야 합니다.

Console.WriteLine("Second: " + (st.ElapsedTicks / Stopwatch.Frequency));

(위의 코드는 오타 교정에 첨부하겠습니다.)

ElapsedTicks와 ElapsedMilliseconds가 다른 경우는 Stopwatch.Frequency의 값이 10000 * 1000이 아닌 경우입니다. 그렇다고는 해도 결국 중요한 것은 ElapsedTicks입니다. ElapsedMilliseconds는 ElapsedTicks로부터 Frequency에 따라 산출한 계산 결과입니다.

DateTime과의 관계는, 시스템에 고정밀 타이머가 설치되지 않은 경우에는 DateTime == Stopwatch입니다. (대개의 경우 요즘 시스템에는 다 부착되어 있는) 고정밀 타이머가 있는 경우에는 DateTime과 Stopwatch는 같지 않고 더 정밀한 타이머 값을 가지게 됩니다.

정리해 보면, ElapsedTicks는 측정 틱수는 맞긴 하지만 초당 틱수를 알려주는 Frequency가 있기 때문에 시간으로도 변환이 되는 것입니다.

------------

참고로, Frequency의 경우 고정밀 타이머가 있어도 대체로 10000 * 1000 값을 갖고 있습니다. (혹시 나나님의 컴퓨터에서는 저 값이 몇으로 나오나요?)
정성태
2018-07-25 10시20분
DateTime.Ticks에 대해서는 다음의 글을 읽어보시면 도움이 될 것입니다.

C# - DateTime.Ticks의 정밀도
; http://www.sysnet.pe.kr/2/0/11082
정성태
2018-07-25 10시35분
아래의 정오표에 내용을 추가했습니다.

도서: 시작하세요! C# 7.1 프로그래밍: 기본 문법부터 실전 예제까지
; http://www.sysnet.pe.kr/2/0/11265
정성태
2018-07-25 05시35분
[나나] Stopwatch.Frequency로 측정해보니 초당 측정가능 틱 수가 3421873네요.
그러면 st.ElapsedTicks 값이 3421873이상이여야 화면에 1이라고 나오겠군요.
Stopwatch.IsHighResolution값이 True이므로 고정밀 타이머를 사용하고 있음을 확인했습니다.
[guest]
2018-07-26 05시00분
@나나 님, Frequency가 정말 다르게 나오는 PC가 있군요. ^^ 혹시, 컴퓨터의 마더보드와 CPU 종류도 좀 알 수 있을까요? 제 주변에는 그 값이 모두 10000000으로 나오기 때문에 어떤 종류의 PC에서 그런 값이 나오는지 궁금합니다.
정성태
2018-07-26 05시29분
[나나] CPU는 인텔 i5-6600k를 사용하고 있구요, 메인보드는 ASUS 막시무스 VIII Gene을 사용하고 있습니다.
램은 16GB를 사용하고 있습니다.
[guest]
2018-07-26 11시23분
막시무스에 K 버전이면, 혹시 오버클럭하셨나요?
정성태
2018-07-26 11시49분
[나나] 오버클럭은 하지 않았습니다. 윈도우 10이구요. 윈도우 업데이트는 항상 최신으로 유지를 합니다. 64비트 환경이고 컴파일은 debug모드, Any CPU로 놓고 합니다.
바이오스 업데이트는 생각날 때마다 한번씩 체크합니다. 마침 최신 업데이트가 있으니 업데이트 해야겠군요.
[guest]
2018-07-26 12시15분
[나나] 비주얼 스튜디오 2017 컴파일 하고 있고 닷넷 버전는 4.7.1입니다.
[guest]

... 76  77  78  79  80  81  82  83  84  [85]  86  87  88  89  90  ...
NoWriterDateCnt.TitleFile(s)
357정성태4/25/200612052            답변글 [답변]: [답변]: 귀찮게 해드려 죄송스럽지만. [1]
352산들바람4/19/200611721이번겨울방학때세도나를 여행하려구하는데요,,,
353정성태4/20/200619052    답변글 [답변]: 이번겨울방학때세도나를 여행하려구하는데요,,,
351오기4/18/200611495aspx [2]
350유지연4/17/200612212smartclient DB connection관련 질문 입니다. [2]파일 다운로드1
349선재빠4/17/200612123object tag를 2개 넣으면 IE가 죽어버리네요. [2]
347박찬용4/13/200612176COM+에 관한 질문입니다. [2]
345선재빠4/11/200612969Winform을 띄울 수 있는 방법이 있나요? [3]
344선재빠4/10/200614173ASP.NET 2.0에서는 VIEWASTEXT 이란 태그옵션을 지원하지 않는군요 [3]
343선재빠4/10/200613391아래와 같은 에러가 나네요.
341선재빠4/8/200613087테스트 페이지를 보면 프레임만 나오고 안에 내용이 나오지 않는군요 [1]
340김형태4/4/200612234파일서버 관련 질문드립니다.. (데브피아 답변에 이어) [2]
339조남정4/4/200612355post 주소 읽어오기 [1]
338장두헌4/4/200613936SDK PlatForm 다시 질문 - 데브피아의 내용 [1]
337강완모4/3/200614207Cab파일이 아닌 설치용 파일로 OCX들 설치하기... [1]
335비니3/23/200615257밑에 Smart Client에 대해서 질문했던 초보입니다.. TreeView컨트롤은 보이는데 안에 내용이 안보여요. [1]
336비니3/24/200613101    답변글 [재질문]:자꾸 죄송합니다...링크페이지로 이동을 안해요.... [1]
334비니3/23/200612733Smart Client강의 따라해보다가 xml에서 활성스키마는 <Tree>,<L> 요소는 지원하지 않는다고 나와요.ㅠㅠ [1]
332정준명3/21/200612789[자문자답] VS.NET에서 COM을 참조했는데, 강력한 서명이 없다고 사용불가네요.
333정성태3/22/200611232    답변글 [답변]: [자문자답] VS.NET에서 COM을 참조했는데, 강력한 서명이 없다고 사용불가네요. [1]
330심현철3/3/200614396[질문] VS2005에서 C#으로 개발한 DLL을 Javascript에서 접근할 수 없습니다. (ActiveX with C#) [2]
329권인성2/27/200612420스마트클라이언트(clickonce) 버전관리 [1]
327권인성2/24/200612206clickonce를 통해 설치 및 업데이트하려고 하는데요...보안때문에요..
331정성태3/12/200613286    답변글 [답변]: clickonce를 통해 설치 및 업데이트하려고 하는데요...보안때문에요..
325권인성2/23/200611815SETUP 및 배포관련 [1]
326권인성2/23/200611347    답변글 [답변]: 한가지만 더 질문할게요.... [1]
... 76  77  78  79  80  81  82  83  84  [85]  86  87  88  89  90  ...