aboutsummaryrefslogtreecommitdiff
path: root/docs/PERFORMANCE.md
diff options
context:
space:
mode:
Diffstat (limited to 'docs/PERFORMANCE.md')
-rw-r--r--docs/PERFORMANCE.md12
1 files changed, 6 insertions, 6 deletions
diff --git a/docs/PERFORMANCE.md b/docs/PERFORMANCE.md
index bf5d97b..981454d 100644
--- a/docs/PERFORMANCE.md
+++ b/docs/PERFORMANCE.md
@@ -4,7 +4,7 @@
-->
# Performance
-The targets are in [README section 18](../README.md#18-performance-budgets). This document records how each number is measured, what it does and doesn't tell you, and the results.
+The targets are in [PROJECT_PLAN section 18](PROJECT_PLAN.md#18-performance-budgets). This document records how each number is measured, what it does and doesn't tell you, and the results.
## How it is measured
@@ -22,7 +22,7 @@ The targets are in [README section 18](../README.md#18-performance-budgets). Thi
| `startup_ms` | 100 ms | M4 measured 1 to 18 ms; the margin absorbs simulator jitter |
| `first_frame_wall_ms` | 36000 ms | Regression guard only: about 2× M4's 16-18 s, which include loading the glance and opening the app from it |
| `mem_used_fraction` | 70 % | Hard limit, leaves room for spikes on the 512 KB watches |
-| `glance_mem_used_fraction` | 70 % | Hard limit on the glance's 64 KB (README 18), measured after its first draw |
+| `glance_mem_used_fraction` | 70 % | Hard limit on the glance's 64 KB (PROJECT_PLAN 18), measured after its first draw |
| Watchdog | Each job step at most half the per-event limit | `make watchdog`: the largest inputs at two steps per event (M8) |
## Results
@@ -35,7 +35,7 @@ The first numbers from the real watch, read from "Debug: benchmark" on the sidel
| --- | --- | --- | --- |
| TOTP, SHA-1 | 18 ms | under 1 ms | One code per timer event is far inside the watchdog |
| TOTP, SHA-512 | 732 ms | 17.5 ms | About 40 times SHA-1, as the simulator ratio predicted. A list with several SHA-512 entries fills in about one per second; the detail screen shows the code within a second |
-| PBKDF2 | 2,000 iterations per second | about 12,000 | Exactly the lower bound in README 18, so setting a PIN calibrates to the 2,000-iteration floor and unlocking takes about 1 s |
+| PBKDF2 | 2,000 iterations per second | about 12,000 | Exactly the lower bound in PROJECT_PLAN 18, so setting a PIN calibrates to the 2,000-iteration floor and unlocking takes about 1 s |
| Header reading | 0 entries in 1 ms | | The benchmark ran before the demo entries were added, so this says nothing yet |
| Self-test | 292 ms | | The crypto known-answer tests at start-up of the debug build |
| Memory at the benchmark | 179 of 763 KB (23 %) | 21 % at the first frame | Well under the 70 % budget |
@@ -81,7 +81,7 @@ Not covered yet: opening a 4 KB code (`toUtf8` in one event, about 100,000 bytec
| Version 10 | 312 ms, 105 steps | 139 ms, 106 steps |
| Version 26 | 1.4 s, 407 steps | 482 ms, 391 steps |
- Mask scoring now works on packed rows and columns (16 modules per word). The step counts didn't fall, because M8 found that M6's steps were too large for big codes (below) and sized every step by measurement. At 50 ms per tick, a version 10 QR needs at least 5.3 s on the 255S and 2.7 s on the 768 KB watches, plus the watch's compute, which only the on-watch benchmark can tell. README 18's 3 s target is met on the 768 KB watches at best; the cache makes every later opening instant.
+ Mask scoring now works on packed rows and columns (16 modules per word). The step counts didn't fall, because M8 found that M6's steps were too large for big codes (below) and sized every step by measurement. At 50 ms per tick, a version 10 QR needs at least 5.3 s on the 255S and 2.7 s on the 768 KB watches, plus the watch's compute, which only the on-watch benchmark can tell. PROJECT_PLAN 18's 3 s target is met on the 768 KB watches at best; the cache makes every later opening instant.
- **The demo cards in the simulated watches** (first encoding, `make screenshots`):
| Code | Forerunner 255S | 768 KB watches |
@@ -141,7 +141,7 @@ Not covered yet: opening a 4 KB code (`toUtf8` in one event, about 100,000 bytec
These times are mostly the 50 ms pauses between steps. QR is the slow one, because of its eight mask evaluations.
- Version 10 is over README 18's 3 s target. Most of the time is the pauses between steps, and mask scoring (eight masks, every module) is most of the steps. The cache makes every later opening instant. M8 can cut the steps, for example by scoring masks on packed rows. The demo card (version 6) encodes in 2.8 s in the simulated watches (`make screenshots` prints it).
+ Version 10 is over PROJECT_PLAN 18's 3 s target. Most of the time is the pauses between steps, and mask scoring (eight masks, every module) is most of the steps. The cache makes every later opening instant. M8 can cut the steps, for example by scoring masks on packed rows. The demo card (version 6) encodes in 2.8 s in the simulated watches (`make screenshots` prints it).
### M5, 2026-10-20 (version 0.5.0, import)
@@ -157,7 +157,7 @@ Not covered yet: opening a 4 KB code (`toUtf8` in one event, about 100,000 bytec
- **Watchdog.** The scripted UI flow showed it is enforced in normal simulator runs, at the device's limit per event (120,000 bytecodes on the Forerunner 255S, 240,000 on the others):
- **PBKDF2:** 200 byte-wise iterations in one step tripped it on the 255S. Rewritten to XOR 32-bit words, PBKDF2 takes 22 ms per 1,000 iterations in the simulator, down from 52 ms, and a step is now 100 iterations.
- **SHA-512:** one SHA-512 code per event fits on the 255S; two in one draw don't. The list and the detail screen compute codes in their own timer events, at most one SHA-512 code per event.
-- **On the watch.** The debug build's menu has "Debug: benchmark", which times TOTP with SHA-1 and SHA-512, PBKDF2 iterations per second, header reading and the self-test, one per timer event. Those are the numbers for README 18's watch targets; they come from your Forerunner 70 (real-watch checklist).
+- **On the watch.** The debug build's menu has "Debug: benchmark", which times TOTP with SHA-1 and SHA-512, PBKDF2 iterations per second, header reading and the self-test, one per timer event. Those are the numbers for PROJECT_PLAN 18's watch targets; they come from your Forerunner 70 (real-watch checklist).
### M3, 2026-10-19 (version 0.3.0, storage)