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.
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..
Das ist wohl ein weit verbreiteter Mythos, mehr aber auch nicht
Und nein, es ist fuer ein Gratis Projekt, was auch hier vielen hilft, boese Bots vom Hals zu halten. Aber ich denke diese "bescheuerte Speicher-Management-Architektur" (oder was auch immer das sein soll) von PHP fuehrt mich geradewegs auf eine viel bessere Idee, die der Lookup Tables..
Vergleicht man es mit Arrays, wuerde man in PHP einen Aufzug also so bauen:
- eigentlich KOENNTE er ja 30 Personen ("Daten") befoerden (WENN er richtig konzeptioniert waere)
- man minimiert aber die Tragkraft und den Raum dadurch, dass man ihn mit dickem, dickem Stahlbeton/Blei oder sonstigem Schwerwiegenden ("Overhead") ummantelt.
- schliesslich ist der Aufzug so klein und so schwer, dass nur noch 2 Personen ("Daten") reinpassen
Keiner wird dazu etwas sagen, denn das "ist doch voellig normal", nicht wahr [ok, fuer mich nicht, aber ich bin dann wohl eine Ausnahme..]