Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Get CPU percent usage on macOS

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.

like image 922
houbysoft Avatar asked Jul 22 '11 02:07

houbysoft


People also ask

What is CPU usage on Mac?

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.

How can I see my max CPU usage?

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”.


2 Answers

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];     } } 
like image 153
VenoMKO Avatar answered Sep 22 '22 14:09

VenoMKO


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!")         }     } } 
like image 40
Cœur Avatar answered Sep 26 '22 14:09

Cœur