C #을 사용하여 밀리 초 단위로 시간 가져 오기


131

밀리 초 단위로 시간을 가져야하는 프로그램을 만들고 있습니다. 시간이 지남에 따라, 나는 결코 자신과 같지 않은 숫자를 의미하며, 항상 2 초 전보다 1000 숫자가 더 큽니다. 나는 DateTime.Nowa 로 변환 TimeSpan하고 TotalMilliseconds그로부터 얻는 것을 시도했지만 ... 완전히 정확하지 않다고 들었습니다.

더 쉬운 방법이 있습니까?


두 번의 통화로 항상 가치가 높아질 것으로 기대하십니까? 일반적으로 타이머 해상도가 허용하는 최소 간격보다 가까운 통화는 동일한 값을 생성합니다. 가짜 정밀 직렬 변환기 형태로 자체 타이 브레이커를 추가해야합니다.
Steven Sudit

16
"그 자체와 절대 같지 않은 숫자". 복잡해 보입니다. ;)
Mizipzor

1
NaN은 실제로 그 요구 사항에 맞습니다. "숫자가 아님"에도 불구하고, 그것은 숫자 유형이며 그 자체와 같지 않습니다.
Yay295

답변:


78

Stopwatch수업을 사용하십시오 .

경과 시간을 정확하게 측정하는 데 사용할 수있는 일련의 방법 및 속성을 제공합니다.

그것을 구현하는 좋은 정보가 있습니다 :

성능 테스트 : System.Diagnostics.Stopwatch를 사용한 정확한 런타임 측정


8
스톱워치는 진단의 일부입니다. 실제 코드에서 사용해야합니까?
Andrey


이것은 일반적으로 가장 가까운 15ms 정도만 정확합니다.
Steven Sudit

11
그래도 얼마나 비쌉니까? 아마도 우리는 스톱워치를 스톱워치해야합니다 :)
jb.

3
@Steven은 OS와 기본 하드웨어에 따라 다릅니다. 사용 가능한 경우 고해상도 타이머가 사용되는데, 이는 내가 알고있는 모든 현재 데스크탑 및 서버 기반 x86 Windows 버전의 경우입니다. 자세한 내용은 Frequency 및 IsHighResolution 속성을 확인하십시오. OS 수준에서 QueryPerformanceCounter 및 QueryPerformanceFrequency는이 기능을 지원하는 저수준 API입니다.
Chris Taylor

320
long milliseconds = DateTime.Now.Ticks / TimeSpan.TicksPerMillisecond;

이것은 실제로 다양한 유닉스 변환 방법이 DateTimeOffset클래스 (.NET Framework 4.6+, .NET Standard 1.3+) 에서 구현되는 방법입니다 .

long milliseconds = DateTimeOffset.Now.ToUnixTimeMilliseconds();

65
제목은 "밀리 초 단위로 시간을받습니다". 이 답변이 도움이됩니다.
항공 우주

33
네, 제기 된 질문에 대한 답변을 찾고있는 사람들에게 이것은 매우 도움이되었습니다. 감사합니다.
user430788

1
소수를 원한다면 ( DateTime.Now매우 자주 업데이트되지 않더라도 ) decimal milliseconds = DateTime.Now.Ticks / (decimal)TimeSpan.TicksPerMillisecond;대신 사용하십시오.
Jeppe Stig Nielsen

1
이것은 검색 결과 및 원래 질문에서 수집 한 내용에 대해 선택된 답변보다 훨씬 유용합니다.
bwoogie

1
이 대답은 내 생명을 구했습니다. 비슷한 코드가 있지만 작동하지 않습니다. 이유를 알 수 없습니다. 그런 다음 long밀리 초 앞에서 데이터 유형을 보았습니다 . int확실히 오버플로를 사용 합니다.
FisNaN

13

DateTime.Ticks속성은 날짜와 시간을 나타내는 눈금 수를 가져옵니다.

10,000 Ticks는 밀리 초 (초당 10,000,000 틱)입니다.


4
그러나 진드기의 해상도가 매우 적은 1 / 젯 10000s, 어쩌면 1 / 62S보다
codymanix

2
@codymanix-MSDN :A single tick represents one hundred nanoseconds or one ten-millionth of a second. There are 10,000 ticks in a millisecond.
Itay Karo

5
물론입니다. 그러나 운영 체제의 해상도가 정확하지 않습니다.
codymanix

6
@codymanix가 맞습니다. 유사하게, 옹스트롬은 길이의 단위입니다. 100 억 옹스트롬은 1 미터를 만듭니다. 높이를 옹스트롬 단위로 64 비트 정수로보고하는 함수를 작성할 수 있지만, 모든 것이 센티미터에 정확한 미터라면, 함수가 나노 미터 이하의 정밀도를 나타내는 사실은 완전히 관련이 없습니다. 덜 중요한 숫자는 쓰레기가 될 것입니다.
Eric Lippert

4
@RedFilter : 나이를 가장 가까운 밀리 초로 알고 있다면 "다시 깜박하면 내 나이는 x 밀리 초가됩니다."와 같은 말을 할 수 있습니다. 더 큰 문제는 의사 소통이 아니라 측정입니다. 여러분의 출생은 가장 가까운 초조차 알려져 있지 않을 것입니다.
Steven Sudit

11

나는 다음 수업을 사용합니다. 나는 인터넷에서 그것을 한 번 발견했는데, 지금 은 최고의 NOW () 이라고 가정했다 .

/// <summary>Class to get current timestamp with enough precision</summary>
static class CurrentMillis
{
    private static readonly DateTime Jan1St1970 = new DateTime (1970, 1, 1, 0, 0, 0, DateTimeKind.Utc);
    /// <summary>Get extra long current timestamp</summary>
    public static long Millis { get { return (long)((DateTime.UtcNow - Jan1St1970).TotalMilliseconds); } }
}

출처를 알 수 없습니다.


5
이 일반적으로 사용되는 스 니펫의 전체 요점 인 FWIW는 Unix 타임 스탬프 표준과 호환되는 타임 스탬프를 만드는 것입니다. 이를 위해서는 매우 중요합니다. 타이밍을 원한다면 불필요하게 비쌉니다.
ToolmakerSteve

8

QueryPerformanceCounter기본 방법을 시도해 볼 수 있습니다 . 자세한 내용은 http://www.pinvoke.net/default.aspx/kernel32/QueryPerformanceCounter.html 을 참조하십시오. 이것이 Stopwatch클래스가 사용하는 것입니다.

.NET / C #에서 틱 정밀도의 타임 스탬프를 얻는 방법을 참조하십시오 . 자세한 내용은.

Stopwatch.GetTimestamp() 이 방법에 대한 액세스를 제공합니다.

public static long GetTimestamp() {
     if(IsHighResolution) {
         long timestamp = 0;
         SafeNativeMethods.QueryPerformanceCounter(out timestamp);
         return timestamp;
     }
     else {
         return DateTime.UtcNow.Ticks;
     }
 }

1
AFAIK 스톱워치는 QueryPerformanceCounter에 내부적 경우 사용 가능
codymanix

그러나 내부 구현은 Stopwatch.GetTimestamp()실제로 해당 방법에 대한 액세스를 제공합니다.
Pieter van Ginkel 16:25의

5

DateTime.Now.TimeOfDay.TotalMilliseconds (현재 날짜)를 사용했는데 도움이되기를 바랍니다.


1
TimeOfDay가 매일 자정에 0으로 재설정되므로 증가하는 값 (원래 포스터 필요에 따라)을 반환하지 않습니다. 또한 DateTime을 사용할 때 포스터에서 언급 한 것과 동일한 잠재적 인 문제가 있습니다. 지금은 총 밀리 초를 얻습니다.
Jim O'Neil

3
Jim O'Neil 나는 u에 동의합니다. 그래서 나는 내 게시물에 "(현재 날짜)"라고 언급했습니다 ... 카운터로 사용되는 밀리 초 부분이므로 여기에 게시했습니다. 나는 여기에 처음이므로 잘못된 곳에 게시했다면 죄송합니다 :)
Sarvan

2

사용하십시오 System.DateTime.Now.ToUniversalTime(). 이렇게하면 판독 값이 알려진 기준 기반 밀리 초 형식으로 변경되어 일 변경 등을 완전히 제거 할 수 있습니다.


알고있는 것이 좋지만 시간을 정확하게 전달하는 것이 아니라 타이밍 (시간 경과 측정)에 관한 질문과 관련이 없습니다.
ToolmakerSteve
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.