Microsoft MVP성태의 닷넷 이야기
Stopwatch.ElapsedTicks와 Stopwatch.ElapsedMilliseconds [링크 복사], [링크+제목 복사]
조회: 13364
글쓴 사람
나나
홈페이지
첨부 파일
 
(연관된 글이 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)
5935양승조 donator4/25/202413Reflection 관련 질문 드립니다. [5]파일 다운로드1
5934양승조 donator4/24/202443Reflection 관련 질문 드립니다. [1]
5933vict...4/23/2024165cpp 라이브러리 디버깅 방법 문의 드립니다. [1]
5932EK4/12/2024681다음 제네릭에서 널익셉션이 뜨는 이유를 알수있을까요? [1]
5931이대희4/2/2024975Windows 앱 SDK C# 템플릿의 용도가 무엇인지요? [1]
5930vict...2/22/20241880ef core, FromSqlRaw 맵핑 질문입니다. [4]
5929a2/17/20241952.Net 8 에서 디버거 변경 [1]
5928vict...2/5/20242112wpf에서 대량 데이터 보여주는 방법 추천 부탁드립니다. [1]
5926엄태영1/12/20242059잘못된 Task 사용으로 인한 데드락 관련 질문 입니다. [3]
5925Euni...12/22/20232007Visual Studio에서 nodejs 사용시 npm install -g @vue/cli 실행시 오류 [1]
5924Euni...12/21/20232086Visual Studio에서 nodejs 사용시 C:\Program Files\nodejs\\node.exe" "C:\Program Files\nodejs\\node_modules\npm\bin\npm-cli.js" prefix -g 를 찾지 못하는 설치 오류 [2]
5923정두호12/4/20232537MSSQL 데이터 전송과 공유폴더의 데이터 전송 차이점 [1]
5922Heeg...10/27/20234710C++의 double pointer를 C#에서 구현하는 방법이 잘 안됩니다. [3]
5921한예지 donator10/3/20234482마샬링 정의 및 목적이 궁금합니다. [5]
5920한예지 donator10/3/20233361C#과 WIN32 API 관계 질문드립니다. [4]
5919이건우9/27/20233002WinForm의 로딩속도 관련 질문입니다 [2]
5917한예지 donator9/14/20233101동기화 도구 질문 있습니다. [4]
5916한예지 donator9/3/20233256Thread.Sleep(500), await Task.Delay(500), Task.Delay(500) 차이점이 궁금합니다. [2]
5915한예지 donator8/30/20233119비동기 코드를 for 문 안에 작성한 경우 제어 변수가 올바르게 동작하지 않는 이유가 궁금합니다. [3]
5914한상욱8/11/20232978.net wpf에서 skiasharp 의 skelement 를 canvas로 사용 하고 있습니다. [1]
5913김태우8/10/20233065지역변수로 이해하는 메서드매개변수 게시글 댓글 [3]
5912guest4/25/20235360[참고 - 초보용] Sqlite 디비는 double이 없고 Real이 대신합니다 [3]
5911guest4/24/20233585Form1.cs와 외부 class.cs와 통신 (static async method포함) [4]파일 다운로드1
5910guest4/24/20233422Async 메서드와 try~catch [1]
5909guest4/22/20233830Visual Studio 구매 시(1인 개발자) [4]
[1]  2  3  4  5  6  7  8  9  10  11  12  13  14  15  ...