double ProcessMetrics::GetCPUUsage() { FILETIME now; FILETIME creation_time; FILETIME exit_time; FILETIME kernel_time; FILETIME user_time; GetSystemTimeAsFileTime(&now); if(!GetProcessTimes(process_, &creation_time, &exit_time, &kernel_time, &user_time)) { // We don't assert here because in some cases (such as in the Task Manager) // we may call this function on a process that has just exited but we have // not yet received the notification. return 0; } int64 system_time = (FileTimeToUTC(kernel_time) + FileTimeToUTC(user_time)) / processor_count_; int64 time = FileTimeToUTC(now); if((last_system_time_ == 0) || (last_time_ == 0)) { // First call, just set the last values. last_system_time_ = system_time; last_time_ = time; return 0; } int64 system_time_delta = system_time - last_system_time_; int64 time_delta = time - last_time_; DCHECK(time_delta != 0); if(time_delta == 0) { return 0; } // We add time_delta / 2 so the result is rounded. int cpu = static_cast<int>((system_time_delta * 100 + time_delta / 2) / time_delta); last_system_time_ = system_time; last_time_ = time; return cpu; }
double ProcessMetrics::GetCPUUsage() { FILETIME creation_time; FILETIME exit_time; FILETIME kernel_time; FILETIME user_time; if (!GetProcessTimes(process_, &creation_time, &exit_time, &kernel_time, &user_time)) { // We don't assert here because in some cases (such as in the Task Manager) // we may call this function on a process that has just exited but we have // not yet received the notification. return 0; } int64 system_time = (FileTimeToUTC(kernel_time) + FileTimeToUTC(user_time)) / processor_count_; TimeTicks time = TimeTicks::Now(); if (last_system_time_ == 0) { // First call, just set the last values. last_system_time_ = system_time; last_cpu_time_ = time; return 0; } int64 system_time_delta = system_time - last_system_time_; // FILETIME is in 100-nanosecond units, so this needs microseconds times 10. int64 time_delta = (time - last_cpu_time_).InMicroseconds() * 10; DCHECK_NE(0U, time_delta); if (time_delta == 0) return 0; // We add time_delta / 2 so the result is rounded. int cpu = static_cast<int>((system_time_delta * 100 + time_delta / 2) / time_delta); last_system_time_ = system_time; last_cpu_time_ = time; return cpu; }