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

... 61  62  [63]  64  65  66  67  68  69  70  71  72  73  74  75  ...
NoWriterDateCnt.TitleFile(s)
1004뽀로로12/12/20119224Managed 어셈블리에서의 COM EntryPoint procaddress 문제 [1]
1003나그네12/8/201111226닷넷에서 가상메모리(Commit) 의 크기를 줄이거나 해제하는 방법은 어떻게 해야할지요? [1]
1002나그네11/29/201110814안녕하세요 ^^ 문제가 생겨서 혹시나 여기서라면 답이 나오지 않을까 해서.. [1]
1001선무당11/29/201111688clickonce+ntd 시스템에서 proxy Server 가 개입되는 경우 cache 해결을 위한 방법... [1]
1000초보개발자11/28/201110280웹서비스용 웹 서버의 SSD 가치에 대해서... [1]
999날쌘돌이11/25/201110562ADFS와 WIF 질문 [1]
998윤용한11/9/201111233File Write 도중 정전 발생 시 대처 방법 있나요? [2]
997조장원11/7/201110723Silverlight 에서의 Auth 방법에 대한 고찰 [2]파일 다운로드1
996파몽11/3/201113875VS2010 에서 타겟플랫폼이 x86으로 변경이 된걸일까요? [2]
995강신명10/24/201110354sharepoint2010+win7 client 오류 [2]파일 다운로드1
992라이언10/11/201110731캡션에 chapter numbers 넣기
993정성태10/11/201113128    답변글 [답변]: 캡션에 chapter numbers 넣기
991우상욱8/21/201114543세션 타임 아웃에 관해서 질문드립니다. [2]
990김재영8/20/201118068VS2010의 윈폼의 Load이벤트에서 예외가 잡혀지지 않습니다. [3]파일 다운로드1
989우상욱8/20/201111290polling에 대해 감이 안잡혀서 질문드립니다 [1]
988WooY...8/17/201111846성태님~ 작은 부탁 하나 있습니다~ [2]
987에스패스트8/3/201113415비밀글쓰기가 있으면 참좋을탠대 아쉽네요 ^^ 저 한가지만더.. [5]
986에스패스트8/3/201116566안녕하세요 ^^ 이렇곧도 있군요 ~ 참좋네요 질문 한가지 여쭤볼게요 [6]
985이성환7/27/201112797P/Inovke 관련 질문입니다. [4]파일 다운로드1
983이성환7/13/201120892Mouse이벤트 관련해서 질문있습니다. [10]파일 다운로드2
982궁굼이7/12/201113673TFS2010 사용관련 [2]
981김창욱7/11/201115165주식형태의 프로그램 처럼 SQL서버의 특정 필드 데이터의 변화가 있을때 재 클라이언트가 정보를 갱신 할 수 있게 하는 방법은 없을까요? [2]
980YJ7/7/201114555App Pool idle time 과 WCF 서비스의 비동기 function 호출. [3]
979왕초보7/1/201112729Apache + IIS Redirect [2]
9776/16/201117315웹컨트롤 어느거 쓰는게 좋나요 [1]
976박성준6/13/201112993VS2008 Add-in 구현 관련 질문 [4]
... 61  62  [63]  64  65  66  67  68  69  70  71  72  73  74  75  ...