INFINITE
INFINITE

Reputation: 76

Intentionally causing high CPU usage

I have a question that other people usually have a problem with.

I am building an application that measures battery discharge.

My plan is to simulate high CPU usage and then measure the time it takes the battery to drop to a certain level.

How can I cause high CPU usage on purpose, but without blocking the UI?

Can I do something like this?

DispatchQueue.global(qos: .background).async { [weak self] in
    guard let self = self else { return }
    for _ in 0..<Int.max {
        while self.isRunning {
        }
        break
    }
}

Upvotes: 2

Views: 1341

Answers (1)

timbre timbre
timbre timbre

Reputation: 13990

What you want is persistent load on CPU, with number of threads concurrently loading CPU >= number of CPUs.

So something like

DispatchQueue.concurrentPerform(iterations: 100) { iteration in
    for _ in 1...10000000 {
        let a = 1 + 1
    }
} 

Where:

  • The concurrentPerform with iterations set to 100 makes sure we are running in parallel using every available thread. This is overkill of course, would be enough 4 threads to get every CPU busy on quad core, and about 10 threads is what iOS typically allocates at max per process. But 100 simply makes ruee it really happens)
  • The 1...10000000 makes loop really really long
  • The let a = 1 + 1 gives CPU something to do.

On my iPhone 8 simulator running this code created a picture like this (stopped it after about 30 sec): enter image description here

Careful though! You may overheat your device

Upvotes: 5

Related Questions