The code below will help you get the CPU usage values. It is useful to build a log system for your iOS application with Swift.
What is a CPU tick?
A tick is an arbitrary unit for measuring internal system time. There is usually an OS-internal counter for ticks; the current time and date used by various functions of the OS are derived from that counter.
How many milliseconds a tick represents depends on the OS, and may even vary between installations. Use the OS’s mechanisms to convert ticks into seconds.
- On MS Windows, there are 10,000 ticks in a millisecond (see http://msdn.microsoft.com/en-us/library/system.datetime.ticks.aspx ).
- On Linux, the number of clock ticks per second can be obtained using
sysconf(_SC_CLK_TCK);
. See e.g. http://linux.die.net/man/2/times
As to why a thread reports it’s not being called: That will depend on whether the thread is blocking somewhere (waiting, I/O etc.). If it is not blocking, then yes, the OS’s scheduler will decide when it gets to run, which may be a long time if the system is busy.
Get overall CPU usage not of a single app
The CPU statistics is obtained by calling host_statistics()
and the “flavor” argument must be HOST_CPU_LOAD_INFO
. hostInfo
contains the pointer to the allocated structure, so that value must be rebound, not the address of the variable.
func CPULoadInfo() -> host_cpu_load_info? { let HOST_CPU_LOAD_INFO_COUNT = MemoryLayout<host_cpu_load_info>.stride / MemoryLayout<integer_t>.stride var size = mach_msg_type_number_t(HOST_CPU_LOAD_INFO_COUNT) let hostInfo = host_cpu_load_info_t.allocate(capacity: 1) let result = hostInfo.withMemoryRebound(to: integer_t.self, capacity: HOST_CPU_LOAD_INFO_COUNT) { host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, $0, &size) } if result != KERN_SUCCESS{ print("Error - \(#file): \(#function) - kern_result_t = \(result)") return nil } let data = hostInfo.move() hostInfo.deallocate() return data }
Alternatively, use a local variable instead of allocating and releasing the host_cpu_load_info
structure:
func hostCPULoadInfo() -> host_cpu_load_info? { let HOST_CPU_LOAD_INFO_COUNT = MemoryLayout<host_cpu_load_info>.stride/MemoryLayout<integer_t>.stride var size = mach_msg_type_number_t(HOST_CPU_LOAD_INFO_COUNT) var cpuLoadInfo = host_cpu_load_info() let result = withUnsafeMutablePointer(to: &cpuLoadInfo) { $0.withMemoryRebound(to: integer_t.self, capacity: HOST_CPU_LOAD_INFO_COUNT) { host_statistics(mach_host_self(), HOST_CPU_LOAD_INFO, $0, &size) } } if result != KERN_SUCCESS{ print("Error - \(#file): \(#function) - kern_result_t = \(result)") return nil } return cpuLoadInfo }
Result Log: