Bir program yada betiğin başarısı sadece işini tam yapmasıyla olculmez. Gerektiği kadar zaman kullanması, sistem kaynaklarını gerektiği kadar kullanması ve verimli calışması da işin başarılı kabul edilmesinde etkilidir. Bahsettiklerimiz coğu zaman işin doğru yapılması kadar onemlidir.
PHP gibi ağ tabanlı cok kullanıcılı sistemler icin kullanılan programlama dillerinde bu olculere daha cok dikkat edilmelidir. Ağ tabanlı uygulamaların masaustu uygulamalarından en onemli farkı aynı anda farklı yerlerden bir cok kullanıcı tarafından calıştırılacak olmalarıdır. Bu durumda yapılan bir fazla zaman yada sistem kaynağı kullanımı daha cok etkisini gosterecektir.
Bu yazıda PHP ile program/betik yazarken daha iyi bir performans icin dikkat edilebilecek bazı ayrıntılardan bahsedeceğim.
Yazdığınız kodları performans acısından değerlendirirken dikkat etmeniz gereken uc temel konu vardır;
1) Kullandığınız dilin (Yazıda PHP kullanılacaktır) aracları
2) Sistem kaynaklarının kullanımı (hafıza (memory) kullanımı, sabit diskten okuma)
3) Veritabanı kullanımı
Şimdi sırayla bu başlıklara değinelim.
1) Kullandığınız dilin aracları : Programlama dilleri program yazarken kullanmanız icin bir suru fonksiyon (echo(), substr() ) ve araclar (if,while, for) sağlarlar. Bu aracların kullanım amacları farklı farklıdır. Aynı işi farklı araclar kullanarak farklı yollarla yapabilirsiniz. Her farklı yolun harcadığı zaman farklıdır. Burada zamandan kastımız kodun calıştırılırken (PHP motoru tarafından) harcadığı zamandır. İki farklı yolun ne kadar zaman harcadığını basitce basinda ve sonunda zamanı microtime() kullanarak yazdırıp gorebilirsiniz. Daha ayrıntılı ve detaylı bilgiyi Benchmark (PEAR), DBG, Xdebug veya Advanced PHPDebugger kullanarak elde edebilirsiniz. Bu konumuzun biraz dışında
Şimdi PHP aracları kullanırken dikkat edebileceğimiz ufak ayrıntıları listelemeye başlayalım.
Aynı işi birkac defa yapmamak : Aynı işlemi aynı sonucu verecekse tekrar yapmak zaman kaybıdır. Kod yazarken orneğin bugunun tarihi betiğin birkac yerinde yazdırmamız gerekiyorsa hesaplamayı en başta yapıp bir değişkene atıp sonra bunu kullanmak işlem sayısını azaltacaktır.
Karar mekanizmaları (if) gerektiği kadar kullanmak : Kara mekanizmaları normal işlemlerden (toplama,cıkarma,eşitleme gibi) daha cok zaman aldığı icin cok fazla kullanmak doğru değildir. Orneğin aynı şarta bağlı işlemleri bir araya toplamanız daha doğru olacaktır.
Donguleri (for, while ...) doğru kullanmak : Donguler de karar mekanizmaları gibi normal işlemlerden daha cok vakit alırlar cunku her işlem sırasında dongu şartını kontrol ederler. Basit bir ornek vermek gerekirse 3 defa calışacağını bildiğimiz bir dongu gereksizdir. Onun yerine direk olarak işlemi uc defa yazmamız daha doğrudur. Eğer bir dongunun kesin olarak kac defa calışacağını biliyorsak direk olarak işlemeleri yazmamız bize hız kazandıracaktır. Doguleri kullanırken sık yapılan hatalardan biri de kontrol şartlarında aynı işlemi surekli yaptırmaktır. Genel olarak dongulerde dizi (array) kullanırken donguyu dizi sayısı kadar dondururuz (for($i=0;$i
Echo veya print kullanmak: PHP geliştiricileri echo 'nun print ten daha hızlı olduğunu belirtiyorlar (bakınız Kaynak 1). Sonuc yazdırken echo kullanmak daha doğru olacaktır.
String turunde değişkenleri tek yada cift tırnak kullanmak : Tek tırnak kullandığınız zaman PHP motoru değişkeni formatsız olarak kabul eder ve hicbir kontrol yapmaz. Yani tek tırnak kullandığınız değişkenlerde n gibi ozel karakterler ve değişkenler kullanamazsınız. Tek tırnaklı string'de kontrol yapılmadığı icin hızlı calıştığından eğer başka değişken kulllanmayacaksanız ve ozel karakter kullanmayacaksanız tek tırnak kullanmanız daha doğrudur.
Dosya cağırmak (include) : Program yazarken dosya cağırmaya ihtiyac duyduğunuzda include,require,include_once veya require_once kullanırsınız. Require ile include fonksiyonlarinin tek farkı dosya bulunumayınca include uyarı require hata verir. '_once' li fonksiyonlar ise dosyanin daha once cağırılıp cağırılmadığını kontrol eder. Cağrılmışsa yeniden cağırmaz. Eğer bir dosyayı birden fazla cağırma ihtimali yoksa '_once' olmayan fonksiyonları kullanmanız daha doğrudur.
2)Sistem kaynaklarının kullanımı (hafıza (memory) kullanımı, sabit diskten okuma) : Butun programlamlar calışırken kullandığınız değişkenleri hafızada tutar. Hafızayı mumkun olduğu kadar az kullanmak icin gereksiz değişkenler kullanılmamalıdır.
Bir başka dikkat edilmesi gereken konu ise dosya okuma işlemleridir. Dosya okumanız gerektiğinde fscanf gibi paramatre alan fonksiyonların yerine dosyayı satır satır okuyup PHP string parcalama fonksiyonlarını kullanmanız daha doğrudur.
Dosya okuma işi sırasında dikkat edilmesi gereken başka bir konu ise dosyaların okuma işlemi bittikten sonra kapatılmasıdır (fclose() ).
3)Veritabanı kullanımı : Veritabanı kullanan uygulamalar yaparken yaptığınız bağlantı ve sorgu sayısı uygulamanın hızını doğrudan etkiler. Dikkat edilmesi gereken noktaları şoyle sıralayabiliriz.
Bağlantı : Gerektiğinde veritabanına bağlanılmalı ve işlem bittikten sonra bağlantı kapatılmalıdır.
Tasarım : Uygulamanız icin veritabanı oluştururken yapacağınız tasarım hataları uygulamınızın hızını etkiler. (Bu konu başlı başına bir makale konusu olabileceğinden ve bu makalenin konu sınırını aşacağından burda biraz kısa anlatılacaktır.).
Tablo oluştururken alanların birbirinden bağımsız olamsına dikkat edilmelidir (normalization). Yani eğer bir tablonun bir ozelliği başka bir ozellik kullanırak bulunabiliyorsa yani bağımlı ise bu ozelliği alan olarak tabloda belirtmeye gerek yoktur.
Aynı ozellikte bilgiler icin tek tablo oluşturulmalıdır.
Sorgu: Sorgu cumlesi iyi oluşturulmalı ve istenilen sonucların her zaman doğru olarak dondurulduğu kontrol edilmelidir.
Veritabanının kolayca yaptığı (count,rand,limit,date,order vb) işlemler veritabanına yaptırılmalıdır. Sorgu sayısı mumkun olduğu kadar azaltılmalıdır. Bunun icin sorgu işlemleri farklı modullere bolunebilir.
Sorguda sadece gerekli alanlar cekilmelidir ve 'select *' kullanımından kacınılmalıdır.
Veritabanına veri girişi yaparken yapılan kontrolleri mumkun olduğu kadar veri tabanına yapmasını sağlamak. Veri tutarlığını cok ozel durumlar olmadığı surece veritabanı araclarıyla sağlamak (trigger). Veritabanları bu işlemleri yapmak icin tasarlandığı icin sizin yazacağınız programlardan cok daha hızlı ve kolayca bu işlemleri hallederler. Unutmayalımki veritabanları sadece veri depolamak icin değil veriyi kolay işlemek icin kullanılmak icindir