Do M1 Pro and Max CPUs run slower on battery?

One of the most difficult questions about Apple’s M1 series Macs is whether their performance is reduced when they’re running on battery, particularly in Low Power mode. One important part of any answer has to be based on the effects on CPU performance. With the suite of tests which I’ve been using to compare performance of the M1’s Firestorm and Icestorm cores, I’ve now been looking at how running on battery rather than mains power, and Low Power mode, have on performance of the two core types.

Methods

In my last article about M1 core performance, I showed results from running a series of tests intended to measure maximum performance of P (Performance, Firestorm) and E (Efficiency, Icestorm) cores separately. In essence, these run tight loops of code on different units within the core. For instance, a tight compiled Swift loop performs integer dot product calculations, another coded in assembly language performs floating-point arithmetic using registers alone, and another in assembly language runs a short 32-bit vector dot product calculation using NEON instructions on registers alone.

By running multiple processes simultaneously, at a set level of Quality of Service (QoS), macOS runs these processes on specific cores or core clusters. At the minimum QoS, tests run on the E cores alone, while at the maximum QoS, they’re first run on the P cores until they’re fully loaded, and only then on the E cores. Core usage is readily monitored in Activity Monitor’s CPU History window to confirm which cores are used in each test. Full details are given of this in these two previous articles:
Comparing performance of M1 chips: 3 P and E,
Comparing performance of M1 chips: 4 Icestorm.

For this assessment, I rely on my previous measurements on my M1 Pro MacBook Pro 16-inch 2021, running macOS Monterey 12.0.1. Those tests were run with the mains adaptor connected throughout, and with Low Power mode turned off. I have therefore repeated all those tests, on the two E and eight P cores, when running on battery with Low Power mode turned off, and with it turned on (following a restart).

Results

To my surprise, running on battery and Low Power mode had no effect at all on the test performance of E cores. As I described previously, a single test process, running on a notional single E core (although in reality run evenly on both the E cores) ran at the slow speed I have reported for a single E core at low QoS. The performance boost seen with a second process was the same too, even when in Low Power mode.

However, processes running on the P cores, at maximum QoS, took longer to complete when Low Power mode was turned on (and running on battery at the time). For Integer (ALU), Floating-point, NEON and Accelerate tests, Low Power mode effectively slowed each P core to 0.88 (88%) of its throughout, compared to running on battery power (Low Power off), or on mains power. If the tests ran with the P cores at their maximum clock speed of 3.2 GHz with Low Power turned off, turning it on reduced the effective clock speed to 2.8 GHz.

Results from the less well-behaved Mixed test were similar, but attained 0.91 of normal throughput when Low Power mode was on.

m1proIntBattery

This is shown in this set of lines for the Integer test. The upper pair of lines show changing loop throughput in the test as the number of processes on the P cores is increased from 1 to 8, and the lowest broken line shows the same on the two E cores.

The upper solid line is regressed onto the results for the P cores when running on mains power. Superimposed points on that line show the results when running on battery with Low Power turned off, which is indistinguishable. The dotted line immediately below that is the regression line through the equivalent values obtained with Low Power mode turned on. Its gradient is 0.88 of the gradient of the solid line.

Results from all three tests (mains, battery, battery + Low Power) on the E cores are superimposed on the lowest of the lines. As explained in the previous article, the throughput of the second point (two processes) is significantly higher than the line obtained from the 4 E cores of an original M1 Mac mini. Low Power mode has no effect on those results from the E cores.

For those interested in the spread of the other results, here they are, expressed as proportions of mains power test performance:

  • Integer 0.8832
  • Floating-point 0.8830
  • NEON 0.8818
  • Accelerate 0.8817.

I’m impressed at how close they are.

Conclusions

These tests only look at CPU core performance, and can’t be used to infer anything about other performance-limiting parts of the M1 Pro chip. Specifically, they don’t provide any evidence on what might happen to GPU, memory, storage or I/O performance when an M1 Pro MacBook Pro is run on battery or in Low Power mode.

They strongly suggest that, whether run on mains or battery power with Low Power mode turned off, CPU core performance shouldn’t be any different. However, running on battery with Low Power mode turned on can be expected to reduce maximum P core performance to around 88%, equivalent to capping the clock speed at 2.8 GHz.

As the P cores are primarily used to run user apps, the user interface, and more time-critical processes, users may notice this small reduction in performance. If you want your apps to enjoy full performance, then don’t enable Low Power mode on your M1 Mac.