Messungen
ILP32 gegen LP64 beim gleichen Build: Der Gewinn ist Speicher, der Preis einige Prozent Geschwindigkeit.
Echte OpenWrt-One-Hardware
OpenWrt One (MT7981B, 2× Cortex-A53 mit bis zu 1,3 GHz, 1 GB). Zwei Images aus demselben Quellbaum mit denselben Paketen (LuCI, python3-light, dnsmasq) und derselben Kernel-Konfiguration, beide mit GCC 14.3 gebaut; nur die Userspace-ABI unterscheidet sich (die beiden Kernel stammen aus getrennt gebauten Toolchains derselben Quellen). Last: 200 Firewall-Regeln, 50 statische Leases, eine dnsmasq-Blockliste mit 150.000 Domains, LuCI-Anfragen und ein Python-Prozess mit einem Dict aus 100.000 Einträgen. Je drei Starts, Median.
| Speicher | LP64 | ILP32 | Änderung |
|---|---|---|---|
| Userspace-Speicher (PSS, alle Prozesse) | 38.3 MB | 28.9 MB | -24.6% |
| Anonymer Speicher | 30.3 MB | 20.9 MB | -31% |
| Freier Speicher (MemAvailable) | 863.6 MB | 872.2 MB | +8.6 MB |
| python3, Dict mit 100.000 Einträgen | 17.9 MB | 12.4 MB | -31% |
| dnsmasq, Blockliste mit 150.000 Domains | 12.0 MB | 8.8 MB | -26% |
| hostapd / wpa_supplicant | -11% / -9% | ||
| Kernel (Slab) | 28.0 MB | 27.9 MB | -0.6% |
| Zeit (Sekunden, weniger ist besser; mit GCC gebaut) | LP64 | ILP32 | Änderung |
|---|---|---|---|
| Firewall neu laden, 200 Regeln | 2.58 | 2.84 | +10% |
| dnsmasq lädt 150.000 Einträge | 2.96 | 3.03 | +2% |
| 20 Anfragen an die LuCI-Anmeldeseite | 1.73 | 1.81 | +5% |
| python3 baut ein Dict mit 100.000 Einträgen | 0.38 | 0.42 | +11% |
Der Kernel ist in beiden Images LP64, der Kernel-Speicher ändert sich also nicht; die Einsparung liegt
in den Programmen und wächst mit ihren Daten. Ein Router im Leerlauf spart nur einige hundert KB. Der größte Teil
der Zeitkosten entsteht durch den Umgang mit 32-Bit-Zeigern in 64-Bit-Code, mehr noch in Code mit schnellen Pfaden
für ein 64-Bit-long. Mit den meistgenutzten Paketen (ucode, lucihttp, json-c) des ILP32-Images mit clang gebaut dauerte
das Neuladen der Firewall 2.63 s (+2%) und die LuCI-Anfragen 1.76 s (+2%), bei gleichem Speicher
(derselbe OpenWrt One, drei Starts, Median). Das LP64-Image wurde nur mit GCC gebaut; LP64 mit clang
wurde nicht gemessen, ein Teil des Gewinns kann also von clang selbst kommen. Derselbe Test in QEMU (armsr, 256 MB) ergab -26.0% Userspace-Speicher
und +9.6 MB freien Speicher.
CPython auf Cortex-A35- und Cortex-A53-Boards
Dasselbe CPython-Build-Rezept für LP64 und ILP32: ILP32 braucht etwa 30 % weniger Speicher und ist auf dem Cortex-A53 2.6 % und auf dem Cortex-A35 5.7 % langsamer. Builds, Optionen und Zahlen je Benchmark: llvm-ilp32 docs/benchmarks.md.
Wie wir vergleichen
- Gleiche Quellen, gleicher Compiler und gleiche Optionen, gleiche Pakete; nur die ABI unterscheidet sich.
- Mehrere Durchläufe, angegeben ist der Median. Die QEMU-Skripte liegen in test-ilp32
openwrt/; die Skripte und Rohdaten der Hardware-Läufe folgen. - Geschwindigkeit und Speicher werden beide angegeben, auch dort, wo ILP32 langsamer ist.