Methodology
What every subtest measures and how the score is computed.
Every score in Fast&Fast comes from real CPU / GPU / NPU / Memory workloads. No microbenchmarks; no synthetic shaders that don’t match real games. Here’s exactly what each subtest measures and how the final score is computed.
Score formula
subtest_score = round(measure / baseline.measure × baseline.points) phase_score = Σ subtest_score total = Σ phase_score
Baseline = Pixel 8 Pro at exactly 284 917. Rounding is half-up. Every subtest has a fixed point budget; the sum across subtests for the reference device adds up to the baseline total.
CPU — 4 subtests
Each runs in parallel across all cores; reported ops/s is the aggregate across cores. Source: apps/android/app/src/main/cpp/cpu_bench.cpp.
GPU — 3 subtests
Offscreen EGL 3.0 pbuffer at 1024×1024.
NPU — 3 subtests
Memory — 3 subtests
Bench modes
- Quick — ¼ iterations, ~20 s total. Stored locally only.
- Standard — 1× (default). The only mode aggregated in the public leaderboard.
- Long — 3× iterations, ~3 min, useful for throttling observation. Stored locally only.
Cross-implementation validation
The score formula has a canonical TypeScript implementation, a Kotlin mirror in the :score-formula module, and a C++ mirror. CI replays score-vectors.json across all three on every push to keep them byte-identical. If a Kotlin score ever differs from the TypeScript reference by even one point, the build fails.