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

'시작하세요! 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]

... 16  [17]  18  19  20  21  22  23  24  25  26  27  28  29  30  ...
NoWriterDateCnt.TitleFile(s)
5509한예지 donator6/3/20215690ExeccuteNonQuery 질문있습니다! [2]
5508최재남6/3/20216555마우스 이벤트 관련 질문 좀 드리겠습니다. [6]
5507한예6/2/20215701static과 스택오버플로우 질문있습니다. [5]파일 다운로드1
5506이창석6/1/20217102센서의 값을 받아서 PC를 통해 모니터링 하는 것을 만들고 있습니다. [1]
5505kss5/31/20215694.net5에서 소멸자가 어떻게 바뀐건가요? [1]
5503xing...5/24/20216059xingapinet 에 수정 요청 부탁 드립니다. [1]
5501한예지 donator5/23/20215836IProgress 사용법이 궁금합니다. [2]
5500한예ㅈ5/23/20217709비동기 코드 흐름 질문있습니다. [3]
5498곰장어5/21/20215519List에 static 변수를 추가했을때의 궁금증 [3]파일 다운로드1
5497지평선5/20/20216763윈도우 배율을 알 수 있을까요? [1]
5496cs린이5/20/20215398C# 8.0 질문입니다. [2]파일 다운로드6
5495Natie5/13/20214922객체를 생성과 동시에 초기화 하는 방법 [1]
5494지예예지5/13/20217191비동기 코드 흐름이 궁금합니다! [2]
5493xing...5/6/20215093xing api XQCSPAT00600 질문입니다 [4]파일 다운로드1
5492한예지 donator5/5/20215174FromCurrentSynchronizationContext 관련 코드 질문있습니다! [2]
5491조우성5/4/20219621WinForm과 WPF의 성능차이 비교한 자료가 있을까요? [4]
5490한예지 donator5/3/20216021UI 스레드의 Invoke 질문있습니다. [4]
5489저누4/28/20216582시작하세요 C# 9.0, 225페이지 구조체 관련 질문드립니다. [2]
5488종범4/27/20216821C# 비동기 함수 async, await 와 Task의 관계에 대해 질문 드립니다. [6]
5487진우4/27/20216249C# 엑셀 자동화 성능 향상 문의 [2]
5486지나가던...4/26/20215742닷넷 구현 코드 관련 질문 [2]
5485이재원4/17/20216128교재 315페이지 내용 질문 [3]
5484Syong4/16/20219681윈폼 기반의 응용프로그램 dll 참조와 32,64bit 빌드 관련 문의 [4]
5483한예지 donator4/15/20215191익명 형식과 var 관계 질문 있습니다. [2]
5482질문4/13/20216984WPF를 위한 MVVM toolkit 선택과 관련한 문의드립니다. [4]
5480한예지 donator4/5/20217321GetHashCode 질문있습니다! [2]
... 16  [17]  18  19  20  21  22  23  24  25  26  27  28  29  30  ...