I'm a beginner in Objective-C, and I decided to try to write some simple application, so I'm trying to make an app which would measure CPU usage and such. Is there a simple way to get information such as the CPU percent usage using Objective-C in a Cocoa application?
I have found this question Determine Process Info Programmatically in Darwin/OSX which is similar, but not exactly the same. Mainly, I want the CPU percent usage of the whole system, not just my process, and I would actually prefer an Objective-C solution whereas in that question the poster wanted something else.
On a Mac, you can check your CPU usage using the Activity Monitor app. Your CPU usage tracks how hard your computer is working to run programs, make calculations, and more.
Check network activity using this tool if you suspect that a process could be malware. Similarly, Performance Monitor is a built-in Windows tool that gives you a more detailed view of a process's CPU usage over time. To open it, use the Windows Key + R, then type “perfmon”.
Here is the way i did it:
*.h file:
#include <sys/sysctl.h> #include <sys/types.h> #include <mach/mach.h> #include <mach/processor_info.h> #include <mach/mach_host.h>
ivars:
processor_info_array_t cpuInfo, prevCpuInfo; mach_msg_type_number_t numCpuInfo, numPrevCpuInfo; unsigned numCPUs; NSTimer *updateTimer; NSLock *CPUUsageLock;
*.m file
- (void)applicationDidFinishLaunching:(NSNotification *)aNotification { int mib[2U] = { CTL_HW, HW_NCPU }; size_t sizeOfNumCPUs = sizeof(numCPUs); int status = sysctl(mib, 2U, &numCPUs, &sizeOfNumCPUs, NULL, 0U); if(status) numCPUs = 1; CPUUsageLock = [[NSLock alloc] init]; updateTimer = [[NSTimer scheduledTimerWithTimeInterval:3 target:self selector:@selector(updateInfo:) userInfo:nil repeats:YES] retain]; } - (void)updateInfo:(NSTimer *)timer { natural_t numCPUsU = 0U; kern_return_t err = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo); if(err == KERN_SUCCESS) { [CPUUsageLock lock]; for(unsigned i = 0U; i < numCPUs; ++i) { float inUse, total; if(prevCpuInfo) { inUse = ( (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER]) + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM]) + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]) ); total = inUse + (cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE] - prevCpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]); } else { inUse = cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_USER] + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_SYSTEM] + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_NICE]; total = inUse + cpuInfo[(CPU_STATE_MAX * i) + CPU_STATE_IDLE]; } NSLog(@"Core: %u Usage: %f",i,inUse / total); } [CPUUsageLock unlock]; if(prevCpuInfo) { size_t prevCpuInfoSize = sizeof(integer_t) * numPrevCpuInfo; vm_deallocate(mach_task_self(), (vm_address_t)prevCpuInfo, prevCpuInfoSize); } prevCpuInfo = cpuInfo; numPrevCpuInfo = numCpuInfo; cpuInfo = NULL; numCpuInfo = 0U; } else { NSLog(@"Error!"); [NSApp terminate:nil]; } }
Swift 4 equivalent of VenoMKO answer. Usage: let myUsage = MyCpuUsage()
to start the usage observation. Tested with Xcode 10.0.
import Foundation // CPU usage credit VenoMKO: https://stackoverflow.com/a/6795612/1033581 class MyCpuUsage { var cpuInfo: processor_info_array_t! var prevCpuInfo: processor_info_array_t? var numCpuInfo: mach_msg_type_number_t = 0 var numPrevCpuInfo: mach_msg_type_number_t = 0 var numCPUs: uint = 0 var updateTimer: Timer! let CPUUsageLock: NSLock = NSLock() init() { let mibKeys: [Int32] = [ CTL_HW, HW_NCPU ] // sysctl Swift usage credit Matt Gallagher: https://github.com/mattgallagher/CwlUtils/blob/master/Sources/CwlUtils/CwlSysctl.swift mibKeys.withUnsafeBufferPointer() { mib in var sizeOfNumCPUs: size_t = MemoryLayout<uint>.size let status = sysctl(processor_info_array_t(mutating: mib.baseAddress), 2, &numCPUs, &sizeOfNumCPUs, nil, 0) if status != 0 { numCPUs = 1 } updateTimer = Timer.scheduledTimer(timeInterval: 3, target: self, selector: #selector(updateInfo), userInfo: nil, repeats: true) } } @objc func updateInfo(_ timer: Timer) { var numCPUsU: natural_t = 0 let err: kern_return_t = host_processor_info(mach_host_self(), PROCESSOR_CPU_LOAD_INFO, &numCPUsU, &cpuInfo, &numCpuInfo); if err == KERN_SUCCESS { CPUUsageLock.lock() for i in 0 ..< Int32(numCPUs) { var inUse: Int32 var total: Int32 if let prevCpuInfo = prevCpuInfo { inUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)] - prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)] + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)] - prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)] + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)] - prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)] total = inUse + (cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)] - prevCpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)]) } else { inUse = cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_USER)] + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_SYSTEM)] + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_NICE)] total = inUse + cpuInfo[Int(CPU_STATE_MAX * i + CPU_STATE_IDLE)] } print(String(format: "Core: %u Usage: %f", i, Float(inUse) / Float(total))) } CPUUsageLock.unlock() if let prevCpuInfo = prevCpuInfo { // vm_deallocate Swift usage credit rsfinn: https://stackoverflow.com/a/48630296/1033581 let prevCpuInfoSize: size_t = MemoryLayout<integer_t>.stride * Int(numPrevCpuInfo) vm_deallocate(mach_task_self_, vm_address_t(bitPattern: prevCpuInfo), vm_size_t(prevCpuInfoSize)) } prevCpuInfo = cpuInfo numPrevCpuInfo = numCpuInfo cpuInfo = nil numCpuInfo = 0 } else { print("Error!") } } }
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With