ILP32
Deutsch

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.

SpeicherLP64ILP32Änderung
Userspace-Speicher (PSS, alle Prozesse)38.3 MB28.9 MB-24.6%
Anonymer Speicher30.3 MB20.9 MB-31%
Freier Speicher (MemAvailable)863.6 MB872.2 MB+8.6 MB
python3, Dict mit 100.000 Einträgen17.9 MB12.4 MB-31%
dnsmasq, Blockliste mit 150.000 Domains12.0 MB8.8 MB-26%
hostapd / wpa_supplicant-11% / -9%
Kernel (Slab)28.0 MB27.9 MB-0.6%
Zeit (Sekunden, weniger ist besser; mit GCC gebaut)LP64ILP32Änderung
Firewall neu laden, 200 Regeln2.582.84+10%
dnsmasq lädt 150.000 Einträge2.963.03+2%
20 Anfragen an die LuCI-Anmeldeseite1.731.81+5%
python3 baut ein Dict mit 100.000 Einträgen0.380.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