프로그램 실행 후 밀리 초 수를 추적하기 위해 C++에서 어떤 방법이 필요합니다. 그리고 정밀도는 밀리 초가되어야합니다. (내 인터넷 검색, 난 time.h을 포함하고이 작동하지 않습니다 ... 1000 time()
의 출력을 곱 말했다 사람들을 많이 발견했습니다.)C++ 일부 날짜 이후로 밀리 초 가져 오기
답변
이 C++ 특정 (도 휴대용)가 아니라 당신이 할 수 있습니다
SYSTEMTIME systemDT;
를 윈도우에서.
거기에서 시스템의 각 구성원에게 액세스 할 수 있습니다.
프로그램을 시작한 시간을 기록하고 현재 시간과 기록 된 시간을 비교할 수 있습니다 (예 : 에 대한 systemDT
).
systemDT.wHour
,
systemDT.wMinute
,
systemDT.wMilliseconds
을 할 것입니다, 당신은 각 구성원에 액세스하려면
GetLocalTime(&systemDT);
를 호출 할 수 있습니다, 새로 고침합니다.
SYSTEMTIME에 대한 자세한 정보를 얻으려면.
일부 크로스 플랫폼 솔루션. 이 코드는 일종의 벤치마킹에 사용되었습니다.
#ifdef WIN32
LARGE_INTEGER g_llFrequency = {0};
BOOL g_bQueryResult = QueryPerformanceFrequency(&g_llFrequency);
#endif
//...
long long osQueryPerfomance()
{
#ifdef WIN32
LARGE_INTEGER llPerf = {0};
QueryPerformanceCounter(&llPerf);
return llPerf.QuadPart * 1000ll/(g_llFrequency.QuadPart/1000ll);
#else
struct timeval stTimeVal;
gettimeofday(&stTimeVal, NULL);
return stTimeVal.tv_sec * 1000000ll + stTimeVal.tv_usec;
#endif
}
gettimeofday()는 Windows에서 지원되지 않습니다. Windows에서 코드를 컴파일하는 동안 QueryPerformanceCounter가 사용됩니다. 고해상도 타이머가 아닙니다. 이 방법은 매우 빠르고 정확합니다. – loentar
벽시계 시간, CPU 시간 또는 다른 측정을 원하십니까? 또한 어떤 플랫폼입니까?
대부분의 유닉스 시스템에- , 당신은 적어도 마이크로 정밀도와 액세스를 제공
gettimeofday()
및/또는clock_gettime()
을 사용할 수 있습니다 ...이time()
및clock()
는 당신을 줄 것보다 더 많은 정밀도를 얻을 수있는 보편적 휴대용 방법은 없지만, 다양한 타이머; - 저는 Windows에 익숙하지 않지만, these functions 중 하나는 아마도 당신이 원하는대로 할 것입니다.
가장 이식성이 시계 function.It를 사용하는 보통 프로그램 프로세서, 또는 그 근사값을 이용하여 한 시간을보고한다. 그러나 다음에 유의하십시오 :
해상도는 GNU 시스템에는 그리 좋지 않습니다. 정말 동정이야.
부서 및 지정을 수행하기 전에 모든 것을 번으로 주조하십시오.
카운터는 GNU 32 비트에서 32 비트 숫자로 유지됩니다.이 값은 장시간 실행되는 프로그램의 경우 매우 귀찮을 수 있습니다.
"벽 시간"을 사용하는 대안으로 Windows 및 Linux에서 더 좋은 해상도를 얻을 수 있습니다. 그러나 libc 매뉴얼에서 알 수 있듯이 : 프로그램을 최적화하거나 효율을 측정하려는 경우, 얼마나 많은 프로세서 시간을 사용하는지 알고 있으면 매우 유용합니다. 프로세스가 입출력을 기다리거나 다른 프로세스가 CPU를 사용하기 위해 시간을 소비 할 수 있기 때문에 달력 시간과 경과 시간은 쓸모가 없습니다.
clock
은 여러 번 제안되었습니다. 여기에는 두 가지 문제가 있습니다. 우선, 밀리 초 (10-20 밀리 초 정도)의 해상도가없는 경우가 많습니다. 둘째, 일부 구현 (예 : Unix 및 유사)은 CPU 시간을 반환하지만 일부는 (예 : Windows) 벽 시간을 반환합니다.
정말 벽에 걸리는 시간과 CPU 시간을 원하느냐고 묻지 않았으므로 정말 좋은 대답을하기가 어렵습니다. Windows에서는 GetProcessTimes
을 사용할 수 있습니다. 그러면 커널과 사용자 CPU 시간을 직접 줄 수 있습니다. 또한 프로세스가 생성 된 시점을 알려주므로 프로세스 생성 후 월 시간을 원하는 경우 현재 시간 (GetSystemTime
)에서 프로세스 생성 시간을 뺄 수 있습니다. QueryPerformanceCounter
도 언급되었습니다. 이것은 약간의 차이가 있습니다. 예를 들어 일부 구현에서는 CPU주기 카운터에서 시간을 검색하므로 CPU 속도가 변경 될 때/그 빈도가 달라집니다. 이 아닌 마더 보드의 1.024MHz 타이머에서 읽은 다른 구현은이 아닌 CPU 속도 (및 각 조건이 완전히 사용되지 않는 조건)에 따라 다릅니다.
유닉스에서 비교적 높은 정밀도 (적어도 가능성)가있는 벽 시간을 얻으려면 GetTimeOfDay
을 사용할 수 있습니다. 프로세스 시간을 원할 경우 times
또는 getrusage
을 사용할 수 있습니다 (후자는 더 새롭고보다 정확한 정보를 제공합니다).
결론 : 내 의견에 말했듯이, 당신이 원하는 것을 얻는 방법은 없습니다. 특정 시스템에 대해서도 CPU 시간 또는 벽 시간을 원한다고 말하지 않았기 때문에 정답은 하나도 없습니다. 귀하가 "수락"한 (clock()
) 것은 본질적으로 모든 시스템에서 의 미덕을 가지고 있지만 그 결과는 가장 광범위하게 변합니다.
그는 벽 시간도 cpu 시간도 아닌 시간 델타를 원합니다. –
그가 정말로해야 할 일은 단순히 프로그램이 시작될 때와 그가 얼마나 오래 실행되었는지를 알아야 할 때를 기록하는 것입니다. 현재 시간을 다시 얻고 두 값을 빼면됩니다. 그것은 당신이 얻을 수있는만큼 정확하게 될 것입니다. –
@Caspin : 우선, 그의 질문이 어떤 확실성을 가진 델타라고 말할만큼 충분히 명확한가 아닌지 질문합니다. 둘째 델타 임에도 불구하고 벽이나 CPU 시간의 델타 (즉, "프로세스가 시작된 이후의 시간"또는 "프로세스에 사용 된 CPU 시간은 얼마나됩니까?") –
여기에 C++ 0x 솔루션과 clock()
이 생각하는대로 작동하지 않을 수있는 예가 나와 있습니다.
#include <chrono>
#include <iostream>
#include <cstdlib>
#include <ctime>
int main()
{
auto start1 = std::chrono::monotonic_clock::now();
auto start2 = std::clock();
sleep(1);
for(int i=0; i<100000000; ++i);
auto end1 = std::chrono::monotonic_clock::now();
auto end2 = std::clock();
auto delta1 = end1-start1;
auto delta2 = end2-start2;
std::cout << "chrono: " << std::chrono::duration_cast<std::chrono::duration<float>>(delta1).count() << std::endl;
std::cout << "clock: " << static_cast<float>(delta2)/CLOCKS_PER_SEC << std::endl;
}
이 출력 :
chrono: 1.36839
clock: 0.36
당신은 clock()
방법은 두 번째 누락 알 수 있습니다. 또한 숙달 된 관찰자는 clock()
이 해상도가 떨어지는 것처럼 보일 수 있습니다. 내 시스템에서는 12 밀리 초 씩 증가합니다.
C++ 0x를 사용할 수 없거나 사용하지 않으려면 Boost.DateTime의 ptime microsec_clock::universal_time()
을 살펴보십시오.
당신이 코드를 시도 할 수 있습니다 (건어 체스 엔진 소스 코드 (GPL)에서 얻을) : 우리가 관심있는 OS를 알아야합니다 생각
#include <iostream>
#include <stdio>
#if !defined(_WIN32) && !defined(_WIN64) // Linux - Unix
# include <sys/time.h>
typedef timeval sys_time_t;
inline void system_time(sys_time_t* t) {
gettimeofday(t, NULL);
}
inline long long time_to_msec(const sys_time_t& t) {
return t.tv_sec * 1000LL + t.tv_usec/1000;
}
#else // Windows and MinGW
# include <sys/timeb.h>
typedef _timeb sys_time_t;
inline void system_time(sys_time_t* t) { _ftime(t); }
inline long long time_to_msec(const sys_time_t& t) {
return t.time * 1000LL + t.millitm;
}
#endif
struct Time {
void restart() { system_time(&t); }
uint64_t msec() const { return time_to_msec(t); }
long long elapsed() const {
return long long(current_time().msec() - time_to_msec(t));
}
static Time current_time() { Time t; t.restart(); return t; }
private:
sys_time_t t;
};
int main() {
sys_time_t t;
system_time(&t);
long long currentTimeMs = time_to_msec(t);
std::cout << "currentTimeMs:" << currentTimeMs << std::endl;
Time time = Time::current_time();
for (int i = 0; i < 1000000; i++) {
//Do something
}
long long e = time.elapsed();
std::cout << "time elapsed:" << e << std::endl;
getchar(); // wait for keyboard input
}
- 1. 특정 날짜 이후로 C# 초
- 2. 밀리 초 타이밍 C++
- 3. XQuery에서 일부 Epoch 이후로 현재 시간을 밀리 초 단위로 가져 오는 방법이 있습니까?
- 4. : 초 : 밀리 목표-C
- 5. (밀리 초)
- 6. 밀리 초
- 7. 일부 UNIX 시간의 날짜 가져 오기
- 8. 밀리 초 단위의 NetStream.seek
- 9. C# 컴퓨터에서 날짜 가져 오기
- 10. Android Chronometer로 밀리 초 표시 (밀리 초 단위로 표시)
- 11. 10 진수 밀리 초 단위의 밀리 초 변환
- 12. mp3 길이 (밀리 초)
- 13. Excel에서 밀리 초 표시
- 14. 자바에서 밀리 초 타이밍
- 15. C 또는 C++의 밀리 초 정밀도 타이밍
- 16. 파이썬 시간 (밀리 초) 계산
- 17. Turbo C++ 시간 분해능 (최대 밀리 초)
- 18. 에포크 값 이후로 밀리 세컨드에서 mysql 업데이트의 날짜를 어떻게 설정합니까?
- 19. Android - SMS 시간 기록에서 밀리 초 단위로 날짜 시간을 가져옵니다.
- 20. 최대 동시 연결 (밀리 초)
- 21. SAS informat datetime 밀리 초
- 22. T-SQL의 반올림 밀리 초
- 23. C에서 밀리 초 단위로 알람 설정
- 24. Windows에서 C++을 사용하는 UTC 시간 스탬프 (밀리 초 단위)
- 25. Obj-c, 시간, 분, 초 및 밀리 초없이 현재 날짜를 가져 오는 코드 줄은 무엇입니까?
- 26. NSString에서 내용의 일부 가져 오기
- 27. 밀리 초 단위의 Windows 시스템 시간
- 28. 코코아의 밀리 초 시간 간격 결정
- 29. 구글 앱 엔진 GQL .. 밀리 초 정확도
- 30. java imap은 날짜 이후로 메일을 가져옵니다.
; 나는 이걸 휴대 할 수있는 방법이 없다고 확신합니다. –
시간이 그렇게 보입니다.아래의 h clock() 솔루션은 잘 작동합니다. 여기에 제가 생각하지 못한 문제가 있습니까? – JnBrymn
글쎄, 나는 개인적으로 clock()을 사용하여 오일러 문제를 해결하는데 얼마나 오랜 시간이 걸리는지 볼 수있다. 그것은 내 경우에는 완벽하기 때문에 당신이 원하는 구체적인 방법에 달려있다. –