Du befindest Dich im Archiv vom ABAKUS Online Marketing Forum. Hier kannst Du Dich für das Forum mit den aktuellen Beiträgen registrieren.

memory_get_usage: n*15Char-String besser als n*4Byte-Array?

Ajax, Hijax, Microformats, RDF, Markup, HTML, PHP, CSS, MySQL, htaccess, robots.txt, CGI, Java, Javascript usw.
Neues Thema Antworten
Airport1
PostRank 10
PostRank 10
Beiträge: 4489
Registriert: 16.08.2004, 18:50
Wohnort: Backnang / bei Stuttgart

Beitrag von Airport1 » 21.05.2007, 15:06

Wenn ich viele IPs in einer Variablen festhalten will, sollte man ja eigentlich annehmen, dass ein Array aus IPLongs (also den Long-Werten der IPs) viel weniger Speicher verbraucht als Strings... doch laut memory_get_usage ist dem NICHT SO.

A: EIGENTLICH verbraucht ja eine IP als String (lassen wir Unicode und Co mal aussen vor, danke ;)) max. 15 Chars aka Bytes, bspw. "123.123.123.123"

B: EIGENTLICH verbraucht ja eine IP als IPLong immer exakt 4 Bytes, bspw. 2130706400

Bildet man nun fuer A einen String, z.B. so:
"123.123.123.123 123.123.123.128"

und fuer B ein Array z.B. so:
array(2130706400, 2130706405)

und nimmt man memory_get_usage(true) zu Rate, kommt doch (Staunen!) tatsaechlich heraus, dass der String (mit einer Info-Dichte von hier z.B. 15+1+15 = 31 Chars) an Speicher SEHR VIEL WENIGER verbraucht, als das Array mit zwei 4-Byte-Long-Werten. Klar, das Array benoetigt noch einen gewissen "Overhead fuer Selbstorganisation" aber demnach ist der ja riesig!?

Man koennte nun annehmen, das ist eben bei wenigen Elementen so, da das Array "Overhead fuer Selbstorganisation" benoetigt. ABER: Die Differenz aendert sich auch NICHT wesentlich, wenn man bspw. 3000 Elemente als String bzw. als Array anlegt, der String verbraucht IMMER weniger Speicher, obgleich er doch EIGENTLICH die hoehere Informationsdichte aufweist.

Ergebnis fuer 3000 15Chars-IPs in String:
Info-Dichte EIGENTLICH: 3000*15 Chars + 3000*1 Leerzeichen: 48000 bytes
REALER SPEICHERVERBRAUCH: 60152 bytes (ca. Faktor 1,25 der Info-Dichte)

Ergebnis fuer 3000 4Byte-Long-IPs in einfachem Array:
Info-Dichte EIGENTLICH: 3000*4 Bytes: 12000 bytes
REALER SPEICHERVERBRAUCH: 184512 bytes (ca. Faktor 15 der Info-Dichte!!)

Muss man das verstehen? Ist das wieder mal ein FEATURE von PHP?
Oder ist die Messmethode get_memory_usage einfach ZU unzuverlaessig, die Testannahmen falsch, was gibt es evtl. an guten Alternativen?

Moeglich waere ja noch dass ein internes type casting stattfindet, nur sehe ich nicht wo es Sinn ergeben wuerde..
Linktauschanfragen zwecklos
https://www.bot-trap.de/ Spamschutz fuer Webmaster - zentrale Meldestelle fuer Web Spam
https://www.airport1.de/blog/ Lombagruschd Blog mid Gardadierle
https://www.ranking-hits.de/ Counter & PR Service