Microsoft MVP성태의 닷넷 이야기
Stopwatch.ElapsedTicks와 Stopwatch.ElapsedMilliseconds [링크 복사], [링크+제목 복사]
조회: 13308
글쓴 사람
나나
홈페이지
첨부 파일
 
(연관된 글이 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]

1  2  3  [4]  5  6  7  8  9  10  11  12  13  14  15  ...
NoWriterDateCnt.TitleFile(s)
5854민성3/16/20232936안녕하세요 asp.net mvc using문 관련하여 [1]
5853pa3/16/20233191오피스 2016 업데이트 후 파일 출력 불가 [1]
5852guest3/16/20232883입력 foreach 검색/출력 foreach [3]
5851guest3/15/20233212foreach내 list변경 [10]
5850독서가3/14/20232883C#에서 동적dll 사용시 문의입니다. [4]파일 다운로드1
5849guest3/9/20232867C# wpf로 Web에서 구동되는 hts가능한가요? (노트북없고 스마트폰 없음) [4]
5848민성3/9/20232777도움 요청드립니다. [2]파일 다운로드1
5847guest3/7/20232921SQlike Like 구문 - 1시간째 인데 안되네요 [13]
5846Huuu...3/7/20232606웹 다운로드에 대한 고찰 [5]파일 다운로드1
5845guest3/7/20232636C# Split함수의 불친절함 [1]
5844까망이3/7/20232758c# 무료 디컴파일러는 어떤게 좋습니까? [1]
5843guest3/7/20232712판매 후 dll 등 에러 [5]
5842kr13/6/20232753publish 할 때 분석기 관련 dll 제외 [5]
5841guest3/3/20232947프로그램 판매 시 - Upgrade 버전 판매 [2]
5840joe3/2/20233042C# 클래스 라이브러리 수정 -> C++에서 참조시 함수 목록 갱신되지 않음. [4]파일 다운로드1
5839guest3/2/20233677윈도우 서비스 프로그램 - FORM 애플리케이션 감시서비스 [8]
5838랄랄라3/1/20232883event 사용 시 두 표현의 차이점이 있을까요? [1]
5837감사합니...2/28/20233037오라클 DB서버 접속관련 문의 드립니다.(Load Balancing, HA Events) [2]
5836박지범2/27/20232831static instance의 initialize 순서가 보장되나요? [6]
5835주민호2/25/20235617Windows Software Development Kit - 최신버전 1개 남기고 다 삭제하면 안되는지요? [10]파일 다운로드1
5834guest2/24/20232876Python IDE - 비주얼스튜디오 [3]
5833무지남2/23/20232591Async 메서드 그리고 나서 Bool 메서드 [5]
5832김지우2/21/20232875event와 delegate의 차이 , event를 써야하는 이유 [1]
5831이우람2/20/20233116ref 전역변수가 pinned가 될수 있나요? [2]
5830냉수마찰2/19/20233421C# GridView에 Column별 데이터 추가하는 방법에 대해 [1]
5829수박942/19/20233418키움 API를 윈폼과 WPF의 네임스페이스 없이 콘솔이나 WinUI3에서 사용할 수 있는 방법이 있나요? [2]파일 다운로드1
1  2  3  [4]  5  6  7  8  9  10  11  12  13  14  15  ...