Array vs Object (Dizilere Karşı Nesneler)
PHP ile kod geliştirenlerin nesneleri veri tutmak amaçlı kullanma alışkanlığı olduğunu sanmıyorum. PHP zengin kullanım şekilleri olan bir dil olduğundan kimisi nesne tabanlı, kimisi fonksiyonlar aracılığı ile kod yazarken kimisi de fonksiyon dahi kullanmadan tamamen düz metin gibi yazıyor :) Hepsini bir kenara atalım. Fonksiyonlar metodlar vs. vs. değil de biz bu nesneleri neden C dilindeki struct gibi bilgi tutmak amaçlı kullanmayalım ki?
Kodun yeni hali şu şekilde oluyor
PHP kodu
Peki burda ben ne yaptım?
her seferinde str_repeat fonksiyonu ile 41bin kere maşallah yazdıracağıma bir kere yazdırdım. Fonksiyonun çağırılma süresinden de kazanıyorum elbette ama bu kodların çıktısı daha bir muhteşem oluyor.
ÇIKTI kodu
maşallah string boyutu: 400.578125 KB seyranli dizi boyutu: 344 byte murat dizi boyutu: 336 byte agakin dizi boyutu: 336 byte cagonni dizi boyutu: 336 byte Kullanılan en yüksek alan: 2.2700576782227 MB
Vay canına! 400 kilobayt lık diziler şimdi 1 kilobaytın 4'te 1'i haline geldi. Boyutlar değiştiği gibi çalışma süresi de 0.1055 saniyeden 0.0266 ya düştü. Peki bu güzelliği neye borçluyuz? Bu güzelliği arka plan da bizim için referans sistemini çalıştıran php ye borçluyuz. Aynı dosyanın en alt satırına
xdebug_debug_zval( 'seyranli' );
ekleyip, seyranli dizisini inceliyorum. Bana şöyle diyor;
ÇIKTI kodu
seyranli: (refcount=1, is_ref=0), array 'isim' => (refcount=1, is_ref=0),string 'Gündüz Can YILMAZ' (length=17) 'ileti' => (refcount=5, is_ref=0), string ......................
aynı incelemeyi diğer diziler için de yapabilrisiniz. Göreceksiniz ki, her refcount değeri 0 iken, yalnızca iletideki refcount 5 olacaktır. Buradan şu sonuç çıkıyor, biz bir değişkeni başka bir değişkene atarsak, php değişken içeriğini kopyalamaktansa referans gibi gösteriyor. Gibi diyorum çünkü referans değiller. Eğer referans olsalardı is_ref alanı 1 olurdu. Hem referans olarak kullandığımız için, hem de str_repeat ile return almadığımız için bellek miktarımız oldukça arttı. Eğer ileti->$masallah yerine ileti->masallah.' ' yazarsanız, yani yalnızca sonuna bir boşluk eklerseniz, ileti alanınında refcount değeri de 0 olur ve dizi boyutları tekrar eski hallerine dönerler. Belleğin tepe değeri en başa dönmez çünkü str_repeat fonksiyonunu üçkez daha az kullandık. Her ne ise, peki aynı şeyleri nesneler yardımı ile yapsak nasıl olurdu sizce?
Sonraki sayfa: benzer örneklerin nesneler üzerinde uygulanması

