프로그램에서 시간의 표시 및 시간 함수 선택

4643 단어
일반적으로 시간 시스템에는 다음과 같은 계층이 있습니다.
1. 절대 시간
2. 네이티브 시스템 시간
3. 이 프로세스 실행 시간
4. 사용자 정의 시간(차분 시스템 시간)
정밀도 요구 사항에 따라 일반적으로 다음과 같이 구분됩니다.
1. 달력 시간
2. 고정밀 시간
장면에 따라 다음과 같이 나눌 수 있습니다.
1. 단일 시스템, 단일 스레드
2. 단일 시스템, 다중 스레드(다중 프로세스)
3. 크로스 시스템, 다중 루틴(다중 프로세스)
linux 시스템과 윈도우즈 시스템은 약간 다르다. 여기서 최근 시간 시스템에 대한 이해를 정리한다.
달력 시간은 종종 년, 월, 일, 시, 분, 초의 형식으로 나타나는데 이것은 정밀도에 대한 요구가 높지 않은 시간에 대한 수요이다.
윈도우즈 API에서 시간을 가져오는 함수:
CTime::GetCurrentTime();
GetLocalTime(&st);
linux에서 timet 데이터 형식으로 저장되며 1970년 1월 1일 00:00:00 이후 국제 표준 시간에 대한 설명 누적값입니다.
time_t는 일반적으로 롱형으로 표시되며, 단위는 초이다.
struct tm는 결과, 월, 일, 시, 분, 초 등으로 표시됩니다
관련 함수:ctime(), gmtime(), localtime(), asctime(), mktime(),strfitme()
일부 함수는timet와 구조 tm의 직접적인 상호 변환:
localtime와 gmtime는 달력 시간을 연월 일시 분초로 표시하는 시간으로 바꾸고 structtm의 구조에 저장한다. 두 가지 차이점은 전자는 현지 시간으로 전환하는 것을 고려하고 시내와 여름 시간제 표지를 고려했다.후자는 국제 표준 시간으로 전환된다.
mktime는 struct tm를 time 로 변환합니다.t, 구조를 초로 변환
ctime와astime는 시간을 시간 문자열로 변환하는데, 차이점은 둘의 인참이고 하나는timet, 또 하나는 struct tm
time(time t)은 가져오기 초 수입니다.
또한 위 함수는 단일 스레드에서 사용되며 다중 스레드가 안전하지 않습니다. 다중 스레드에서 사용할 경우 다음을 사용해야 합니다.
       char *asctime_r(const struct tm *tm, char *buf); char *ctime_r(const time_t *timep, char *buf); struct tm *gmtime_r(const time_t *timep, struct tm *result); struct tm *localtime_r(const time_t *timep, struct tm *result);

이상은 달력 시간과 관련이 있을 뿐 정밀도는 초입니다.
그러나 실시간 시스템에서 많은 일들이 고정밀 시간의 비교를 필요로 한다.
따라서 추가 함수 지원이 필요합니다.
윈도우즈:
TickCount 10ms 정밀도는 사실 tick의 정밀도입니다. 만약 tick의 정밀도가 22ms라면 이 함수의 정밀도는 22ms입니다.많은 밀리초에 표시된 함수인데, 그 정밀도는 1밀리초보다 굵다.
QueryPerfermanceCount/QueryPerformanceFrequency 약 100ns 정밀도
linux에서 두 가지 구조를 제공하는데 하나는 마이크로초급이고 하나는 나초급이다
struct timeval
{
time_t tv_sec;
suseconds_t tv_usec;
};
대응하는 함수 gettimeofday
struct timespec
{
time_t tv_sec;
long tv_nsec;
};
대응하는 함수는 clockgettime()
이 두 함수는 모두 다시 들어갈 수 있는 것이다. 즉, 라인이 안전하다.
프로그램이 정확한 시간을 통계할 때 자주 사용하는 것은 clock () 함수이다.
일반적으로 단일 프로세스의 실행 시간을 통계합니다.그러나 정밀도는 ms보다 굵어야 한다.또한 하위 프로세스의 시간을 통계할 수 없습니다. linux에서는 사용자 공간과 프로세스 공간을 구분할 수 없습니다.
타임즈 함수/시스템 호출은 프로세스, 하위 프로세스의 사용자 코드와 내부 코드의 실행 시간을 구분할 수 있다.그 되돌아오는 구조는 struct tms이다.
그러나 clock과times 함수의 정밀도는 일반적으로 10ms 또는 더 나쁘다.
1. 절대 시간 획득
사용 장면: 크로스 시스템, 다중 스레드 개발
linux시스템에서 1970년 1월 1일 00:00시 이후 국제 표준 시간에 대한 설명 누적값으로 사용하기에 매우 편리하다.timespec이나 timeval 구조는 고정밀의 시계를 비교적 편리하게 제공할 수 있다.
윈도우즈에서 GetTime Tick (),QueryPerformance Counter () 는 본 시스템의 시작부터 통계를 집계합니다.따라서 외부 시간 서버가 지원해야 한다.
2. 네이티브 시스템 시간 시스템 Tick
사용 장면: 본 컴퓨터 시스템, 다중 스레드 또는 단일 스레드 개발
Linux와 Windows는 모두 이런 방식을 지원할 수 있다.
3. 본 스레드의 운행 시간
장면 사용:clock() 함수.간단한 단일 라인 개발에 사용됩니다.
4. 사용자 정의 시간
사용 장면: 비교적 복잡한 시스템, 사용자 정의 시간 서비스의 클래스 라이브러리
a. 통일된 시간 스탬프 인터페이스를 제공한다.linux와 윈도우즈의 시간 함수를 각각 봉인할 수 있습니다.
b. 차등 시계 서비스더 나아가timer 클래스를 봉인하여 실례화된 timer 클래스 start를 제공할 때 현재의 절대 시간이나 시스템 시간 start Time를 기록하고, 이후timer에서 시간을 가져올 때마다 시간차를 제공하기만 하면 된다. (current Time - start Time)이렇게 하면 시간의 표현 형식을 간소화할 수 있고 단지 하나의 정형수로 시간을 표시하기 때문에 넘치는 문제를 걱정할 필요가 없다.이것은 로그 등 서비스에서 사용하는 것이 비교적 좋다.
마지막으로 시간은 문제를 나타낸다.
시간의 초나 밀리초를 정수로 표시할 때, 넘치기 쉽다.다음과 같은 세 가지 방법이 있습니다.
1. 64비트 계수기를 사용한다.Int64는 현재 하드웨어/시스템이 지원할 경우 64비트로 표시되며 비용이 많이 들지만 프로그래밍 사용이 비교적 편리합니다.
2.timeval,timespec, 하나의 통계 초수, 다른 통계 us 또는 ns와 같은 분단식 계수를 사용한다.linux 시스템에서는 비교적 편리하다.
3. 상대 시스템의 시작 시간을 채택한다.
어떤 방식이든 실제 수요에 따라time시간의 표시 방식이 현재 프로그램에서 넘칠지 주의해야 한다.만약 넘칠 수 있다면, 온당한 방식을 골라서 표시해야 한다.
참조:
http://www.cnblogs.com/nanye/articles/2532480.html
http://www.360doc.com/content/12/1227/19/9305922_256634687.shtml
http://blog.csdn.net/tanker1024/article/details/3889308

좋은 웹페이지 즐겨찾기