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
  1. $bellek=memory_get_usage();
  2. $masallah=str_repeat('-Maşallah-',41000);
  3. echo 'maşallah string boyutu: '.boyut(memory_get_usage()-$bellek).'<br />';
  4. $bellek=memory_get_usage();
  5.  
  6. $seyranli=array('isim'=>'Gündüz Can YILMAZ','ileti'=>$masallah);
  7. echo 'seyranli dizi boyutu: '.boyut(memory_get_usage()-$bellek).'<br />';
  8. $bellek=memory_get_usage();
  9.  
  10. $paradox=array('isim'=>'Murat YILMAZ','ileti'=>$masallah);
  11. echo 'murat dizi boyutu: '.boyut(memory_get_usage()-$bellek).'<br />';
  12. $bellek=memory_get_usage();
  13.  
  14. $agakin=array('isim'=>'Ali Gökhan Akın','ileti'=>$masallah);
  15. echo 'agakin dizi boyutu: '.boyut(memory_get_usage()-$bellek).'<br />';
  16. $bellek=memory_get_usage();
  17.  
  18. $cagonni=array('isim'=>'Samet Yüksel','ileti'=>$masallah);
  19. echo 'cagonni dizi boyutu: '.boyut(memory_get_usage()-$bellek).'<br />';
  20.  
  21. echo 'Kullanılan en yüksek alan: '.boyut(memory_get_peak_usage());

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ı

1 2 3 4


Okunma: 652 , Oy Sayısı: 20 , Puan: 9.10

Fatma22 Temmuz 2010 Perşembe 10:19:42


Bir programcı olarak ikilem yaşadığım bir durumdu :) ancak bu denli ölçümler yapmaya üşenmiştim doğrusu. Bana göre dizilerin yapısı daha kolay. Nesne tabanlı programlamayı sadece "Bugün değişik bir şey yapmalıyım" dediğimde kullanıyorum. Sizin de dediğiniz gibi: sadece sıkılınca :)
Verdiğiniz bilgiler için teşekkür ederim, başarılar dilerim.
||




Yorumunuz