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á. Roz­hodně sem vysypu všechny ro­ze­psané články z bu­f­feru a pak se uvidí.

Četl jsem Java 9: Com­pact Strings Voj­tě­cha Rů­žičky o kom­paktní re­pre­zen­taci ře­tězců. Stringy, je­jichž znaky spa­dají do ASCII, jsou re­pre­zen­to­vány kom­paktně jako byte[]. V článku jsem na­ra­zil na:

Java 9 brings a new im­pro­ved string, which in most cases, will reduce String memory con­sumption to half.

To není tak úplně pravda. Platí to asympto­ticky pro ne­ko­nečně dlouhé stringy, ale pro ty kratší to nebude tak slavné. String má kon­stantní režii, která není úplně za­ne­dba­telná. Javě je String tvořen dvěma ob­jekty. String objekt ob­sa­huje uka­za­tel na pole charů (v Javě 9 pole bytů). V paměti to vypadá takhle (na 64 bi­to­vém stroji s kom­pri­mo­va­nými poin­tery):

Oba ob­jekty za­čí­nají 12B hla­vič­kami. Pole ob­sa­huje 4B s in­for­mací o délce. String objekt ob­sa­huje 4B kom­pri­mo­vaný poin­ter, 4B ke­šo­vaný ha­shCode a ne­vy­u­žité 4B ztra­cené kvůli za­rov­nání ob­jektů na 8B hra­nice.

Prázdný string tedy zabere 40 bajtů, krátké stringy budou tuhle cenu platit a re­la­tivní úspora kom­pakt­ních stringů bude o něco méně vý­razná. Bude zá­le­žet jaké délky ře­tězců budou v apli­kaci pře­vlá­dat.


K tématu:

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