funkcionálně.cz

Přední český blog o funkcionálním programování, kde se o funkcionálním programování nepíše
««« »»»

Kompaktní stringy

23. 5. 2017 — k47

S tímhle blogem možná skončím. Možná. Rozhodně sem vysypu všechny rozepsané články z bufferu a pak se uvidí.

Četl jsem Java 9: Compact Strings Vojtěcha Růžičky o kompaktní reprezentaci řetězců. Stringy, jejichž znaky spadají do ASCII, jsou reprezentovány kompaktně jako byte[]. V článku jsem narazil na:

Java 9 brings a new improved string, which in most cases, will reduce String memory consumption to half.

To není tak úplně pravda. Platí to asymptoticky pro nekonečně dlouhé stringy, ale pro ty kratší to nebude tak slavné. String má konstantní režii, která není úplně zanedbatelná. Javě je String tvořen dvěma objekty. String objekt obsahuje ukazatel na pole charů (v Javě 9 pole bytů). V paměti to vypadá takhle (na 64 bitovém stroji s komprimovanými pointery):

Oba objekty začínají 12B hlavičkami. Pole obsahuje 4B s informací o délce. String objekt obsahuje 4B komprimovaný pointer, 4B kešovaný hashCode a nevyužité 4B ztracené kvůli zarovnání objektů na 8B hranice.

Prázdný string tedy zabere 40 bajtů, krátké stringy budou tuhle cenu platit a relativní úspora kompaktních stringů bude o něco méně výrazná. Bude záležet jaké délky řetězců budou v aplikaci převládat.


K tématu:

@kaja47, kaja47@k47.cz, deadbeef.k47.cz, starší články