GabrielleChanel hat geschrieben: Donnerstag 29. April 2021, 09:56
...
Wenn man nun keine Speicherlimite hätte, wäre UTF-32 (ohne Algorithmus) schneller als UTF-8 (mit Algorithmus)?
Wie von @kbr bereits angedeutet, kann man das nicht pauschal beantworten. Falls es Dir jetzt nur um Verarbeitungsgeschwindigkeit von Daten im Speicher geht (alles bereits im RAM), ist zu beachten, dass bei heutigen CPUs die internen Caches 10 - 100x schneller angebunden sind als RAM, heisst für die CPU ist ein uncached load aus dem RAM per se eine teure Aktion (L1 hit ~4 cycles vs. DRAM remote >300 cycles).
Nun belegt UTF8 für westliche Sprachen idR viel weniger Speicher, d.h. ein RAM load mit Cache line update erfasst mehr Nutzdaten, ergo muss die CPU weniger häufig den "langsamen" RAM anfragen. Auf der anderen Seite ist die Entscheidung, ob multibyte char oder ASCII, in UTF8 relativ billig und in wenigen Zyklen entscheidbar (<<20 cycles). Heisst, die algorithmische Zeichenentscheidung in UTF8 ist so billig für die CPU, dass andere Maschineneigenschaften wie Speicherzugriffszeit relevant werden.
Konsequenz des Ganzen ist, dass die Frage nach den anstehenden Operationen beantwortet werden muss:
- sequentielle Verarbeitung: Hier dürfte UTF8 kaum unterlegen sein, ggf. aufgrund von besserer Cache-Lokalität und Zyklus-Vorteilen durch seltenere Speicherzugriffe sogar schneller.
- random access (RA): Feste Speicherbreite in UTF32 erlaubt direkten Index/Offset-Sprung. Hier verliert UTF8, da es iterativ zur gesuchten Position laufen muss. Dieser Unterschied ist wesentlich, da in höherer Komplexitätsklasse (O(1) vs. O(n)). Das kann zwar mit jump tables abgekürzt werden, treibt aber den Speicheraufwand wieder nach oben. Das ist übrigens ein Grund, warum viele Programmiersprachen für die interne Stringrepräsentation UTF32 nehmen (RA-Operationen steht im Vordergrund, während Speicher(-zugriff) relativ immer billiger wird mit wachsendem n).
Übrigens verliert UTF8 die oben genannten Vorteile auch bei sequentieller Verarbeitung, wenn die Zeichen nicht mehr aus dem ASCII-Raum kommen (worst case: alles 4 Byte Zeichen).