我有一个函数,我正在从Linux移植到MacOSX,它使用clock_gettime和CLOCK_THREAD_CPUTIME_ID来测量在进程上花费的时间。 我在互联网上发现了这个代码,相当于CLOCK_REALTIME:
#ifdef __MACH__ // OS X does not have clock_gettime, use clock_get_time
clock_serv_t cclock;
mach_timespec_t ts;
host_get_clock_service(mach_host_self(), CALENDAR_CLOCK, &cclock);
clock_get_time(cclock, &ts);
mach_port_deallocate(mach_task_self(), cclock);
#else
timespec ts;
clock_gettime(CLOCK_REALTIME, ts);
#endif
但我似乎无法找到一个简单的方法来获取clock_gettime(CLOCK_THREAD_CPUTIME_ID,ts); 任何人都知道一个很好的解决方案吗?
答案 0 :(得分:1)
最近我将部分pcsx2项目移植到Darwin / OSX,我也需要类似于CLOCK_THREAD_CPUTIME_ID
的东西。这就是我想出的:
#include <stdint.h>
#include <mach/mach_init.h>
#include <mach/thread_act.h>
#include <mach/mach_port.h>
typedef uint64_t u64;
// gets the CPU time used by the current thread (both system and user), in
// microseconds, returns 0 on failure
static u64 getthreadtime(thread_port_t thread) {
mach_msg_type_number_t count = THREAD_BASIC_INFO_COUNT;
thread_basic_info_data_t info;
int kr = thread_info(thread, THREAD_BASIC_INFO, (thread_info_t) &info, &count);
if (kr != KERN_SUCCESS) {
return 0;
}
// add system and user time
return (u64) info.user_time.seconds * (u64) 1e6 +
(u64) info.user_time.microseconds +
(u64) info.system_time.seconds * (u64) 1e6 +
(u64) info.system_time.microseconds;
}
// Returns the CPU time the calling thread has used (system + user) in
// units of 100 nanoseconds. The weird units are to mirror the Windows
// counterpart in WinThreads.cpp, which uses the GetThreadTimes() API. On
// OSX/Darwin, this is only accurate up until 1ms (and possibly less), so
// not very good.
u64 Threading::GetThreadCpuTime() {
thread_port_t thread = mach_thread_self();
u64 us = getthreadtime(thread);
mach_port_deallocate(mach_task_self(), thread);
return us * 10ULL;
}