Device Conditions

This page explains how Pipette controls device state before performance measurements, and where that control stops.

Timing benchmarks are sensitive to device state. A hot, throttled, busy, or battery-constrained device can produce a result that reflects temporary conditions rather than the model's runtime performance. Pipette controls device state in two ways:

  • Detected conditions. A readiness check reads the device's temperature and load before each measured timing repetition.
  • Managed conditions. The test rig sets power, cooling, and operating-system settings. The readiness check does not measure them.

At present, treat Pipette device measurements as lab-condition results, not as measurements of uncontrolled consumer use. Future iterations may include third-party submissions tagged accordingly; those submissions would not carry a guarantee that the same lab conditions were used.

What the check does

Before each measured repetition, a platform-specific probe waits until the device is both cool enough and idle enough to measure. Each probe reads two kinds of signal:

  • A thermal signal: thermal-zone or die temperatures, and the operating system's thermal state where the platform reports one.
  • A load signal: the share of CPU time that is busy, and GPU load where the platform reports it.

The probe polls until every applicable signal passes or a per-platform deadline elapses. Each criterion is a fixed threshold, and the same thresholds apply to every model. A passing check confirms only that those signals were within their accepted ranges. It does not establish identical physical conditions across devices or platforms.

If any criterion does not pass before the deadline, the probe stops the whole benchmark cell. Pipette does not run the remaining repetitions and stores no partial or throttled measurement. The cell is recorded as an error, so it does not appear in the published results.

The reviewed reference implementation for thresholds, polling intervals, deadlines, and sensor readers is the pipette-clients readiness crate.

readiness start Before a measured repetition probe Read signals: thermal + load (per platform) start->probe ready Every criterion passes? probe->ready deadline Deadline elapsed? ready->deadline no measure Run the measured repetition ready->measure yes wait Wait one poll interval deadline->wait no fail Stop the cell (recorded as an error) deadline->fail yes wait->probe

Per-platform signals

Signals differ by platform because each operating system exposes different sensors. The table shows the criteria for the platforms in the published results and for generic Linux hosts.

Platform Deadline Thermal criteria Load criteria
macOS 7 min OS thermal-pressure level is nominal. SoC die is below 50 °C where its sensors are readable. Less than one busy CPU core, sampled over 1 second
Windows 5 min No sensor within 15 °C of the platform's critical trip point. No active throttle flag. Named sensors at or below a per-host ceiling, where the host sets one. CPU at most 40% busy; GPU compute below 5%
Linux 5 min Hottest thermal zone below 70 °C Load average below 0.30 per CPU
Android (CLI) 5 min OS thermal status is NONE. Hottest CPU-cluster zone is below 34 °C. An optional skin-temperature bound passes. CPU below 30% busy, sampled over 1 second; no touch held on the screen
iOS (app) 5 min OS thermal state is nominal. SoC die is below 36 °C (source build with private interfaces), or an estimate from the motion sensors is below 38 °C (App Store build). Less than one busy CPU core, sampled over 1 second

Platform notes:

  • macOS. The thermal-pressure level is conservative but coarse. On a MacBook Neo it stays above nominal for about five minutes after the CPU goes quiet. The 7-minute deadline gives that wait enough time. See the macOS readiness implementation.
  • Windows. The probe does not wait for temperatures to stop changing. Measurements showed that waiting for flat readings did not change results on the GMKtec EVO-X2 by more than 0.2%, and it made each run take 3.4 times as long. Temperature holds the check only near the hardware's critical trip point, or where a host has a measured ceiling for a named sensor. A host with no temperature counter uses the load criteria only.
  • Linux. A host that exposes no thermal zone uses the load criteria only. See the Linux readiness dispatcher and the generic Linux gate.
  • Android. The OS thermal status stays nominal while the CPU dies reach 75–80 °C, so the CLI also reads the CPU-cluster temperatures directly. Phones use a lower temperature threshold than desktop platforms because their SoCs shed heat more slowly between runs. See the Android readiness implementation.
  • iOS. The app runs its own version of the macOS check. The iOS limitations below explain the two temperature sources.

A platform outside this list has no probe, and its runs start without a readiness check. Treat results from such a platform as advisory.

iOS temperature limitations

Apple's public interfaces do not report the SoC die temperature. The public thermal state is coarse. It can stay nominal while the chip already runs at a lower clock speed.

An app in the App Store must use only interfaces that Apple approves. The App Store build of Pipette therefore cannot read the die temperature. Its readiness check uses the public thermal state and an estimate from the motion sensors, calibrated against the die temperature.

A build from source can turn on private interfaces that read the exact die temperature. Apple does not permit an app that uses private interfaces in the App Store. Such a build runs only on registered development devices.

Published iOS results come from a build with the private interfaces turned on. Anyone can make the same build from the public source with the PIPETTE_PRIVATE_THERMAL=1 setting. See the private-interface build guide. A run from the App Store build uses a less exact readiness check. Its results can differ from the published iOS results.

What the check does not control

The readiness check controls only the device state at the start of each measured repetition. A long repetition can heat the device past the readiness band, even with active cooling. Under a full load, the hottest CPU zone of a cooled Galaxy S26 Ultra reaches its 105 °C trip point within 2–4 seconds. Long cells can therefore include throttled time inside the measured window.

Heavier models heat the device more, so their cells are more likely to reach the deadline and fail. These failures are recorded as errors and are not removed silently, so the failure rate of each cell can be checked.

Externally managed conditions

The rig sets three conditions that the readiness check does not measure. They stay constant for the duration of a run:

  • Power. Phones stay connected to a charger, and dedicated hosts are connected to mains power. Laptops use the adapter that ships with them. Connection to a charger does not prevent a device from drawing power from its battery, and Pipette cannot prevent it:
    • The Galaxy S26 Ultra keeps its battery in the power path. Energy measurements showed the Galaxy S26 Ultra and the iPhone drawing from the battery during a repetition while on the charger.
    • The MacBook Neo ships with a 20 W adapter and can draw up to 33 W. Under load, it can also draw from its battery.
  • Active cooling. Each phone has one powered cooler clamped to its back. No cooler touches the screen, because a cooler on the screen can cause phantom touches. The MacBook Neo has a passive pad inside the case and an active pad under it. Other machines use their stock cooling. A device with added cooling does not represent the product as sold.
  • Operating-system settings. Each device's settings are set to a fixed state before it joins the test fleet.

Each result records the power state that the client read for that result, where the platform reports it:

  • device_battery_level: the battery level, 0 to 100.
  • device_power_state: charging, plugged_in_not_charging, or not_charging (on battery).
  • device_power_save_mode: whether the OS power-save mode is on.

These fields show the power source at the time of the reading. They do not show whether the device also drew from its battery during the repetition. Cooling is not recorded as a field, so an individual result row cannot verify the cooling setup. Because power and cooling affect absolute performance, compare results only with runs known to use the same conditions.

The fleet rig policy and the measured Galaxy S26 Ultra cooling comparison are documented in the version-specific device-conditions methodology.

Where it applies

The timing benchmarks use the readiness check because heat and background work can change the result:

On-device iOS runs use the app's own readiness check, described above. Compare iOS timing results only with other iOS results under the same cooling conditions.