Php ile Kod Performansı
Bir program yada betiğin başarısı sadece işini tam yapmasıyla ölçülmez. Gerektiği kadar zaman kullanması, sistem kaynaklarını gerektiği kadar kullanması ve verimli çalışması da işin başarılı kabul edilmesinde etkilidir. Bahsettiklerimiz çoğu zaman işin doğru yapılması kadar önemlidir.
PHP gibi ağ tabanlı çok kullanıcılı sistemler için kullanılan programlama dillerinde bu ölçülere daha çok dikkat edilmelidir. Ağ tabanlı uygulamaların masaüstü uygulamalarından en önemli farkı aynı anda farklı yerlerden bir çok kullanıcı tarafından çalıştırılacak olmalarıdır. Bu durumda yapılan bir fazla zaman yada sistem kaynağı kullanımı daha çok etkisini gösterecektir.
Bu yazıda PHP ile program/betik yazarken daha iyi bir performans için dikkat edilebilecek bazı ayrıntılardan bahsedeceğim.
Yazdığınız kodları performans açısından değerlendirirken dikkat etmeniz gereken üç temel konu vardır;
1) Kullandığınız dilin (Yazıda PHP kullanılacaktır) araçları
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 araçları : Programlama dilleri program yazarken kullanmanız için bir sürü fonksiyon (echo(), substr() ) ve araçlar (if,while, for) sağlarlar. Bu araçların kullanım amaçları farklı farklıdır. Aynı işi farklı araçlar kullanarak farklı yollarla yapabilirsiniz. Her farklı yolun harcadığı zaman farklıdır. Burada zamandan kastımız kodun çalış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 görebilirsiniz. Daha ayrıntılı ve detaylı bilgiyi Benchmark (PEAR), DBG, Xdebug veya Advanced PHPDebugger kullanarak elde edebilirsiniz. Bu konumuzun biraz dışında .
Şimdi PHP araçları kullanırken dikkat edebileceğimiz ufak ayrıntıları listelemeye başlayalım.
Aynı işi birkaç defa yapmamak : Aynı işlemi aynı sonucu verecekse tekrar yapmak zaman kaybıdır. Kod yazarken örneğin bugünün tarihi betiğin birkaç 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,çıkarma,eşitleme gibi) daha çok zaman aldığı için çok fazla kullanmak doğru değildir. Örneğin aynı şarta bağlı işlemleri bir araya toplamanız daha doğru olacaktır.
Döngüleri (for, while ...) doğru kullanmak : Döngüler de karar mekanizmaları gibi normal işlemlerden daha çok vakit alırlar çünkü her işlem sırasında döngü şartını kontrol ederler. Basit bir örnek vermek gerekirse 3 defa çalışacağını bildiğimiz bir döngü gereksizdir. Onun yerine direk olarak işlemi üç defa yazmamız daha doğrudur. Eğer bir döngünün kesin olarak kaç defa çalışacağını biliyorsak direk olarak işlemeleri yazmamız bize hız kazandıracaktır. Dögüleri kullanırken sık yapılan hatalardan biri de kontrol şartlarında aynı işlemi sürekli yaptırmaktır. Genel olarak döngülerde dizi (array) kullanırken döngüyü dizi sayısı kadar döndürürüz (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). Sonuç yazdırken echo kullanmak daha doğru olacaktır.
String türünde değişkenleri tek yada çift tırnak kullanmak : Tek tırnak kullandığınız zaman PHP motoru değişkeni formatsız olarak kabul eder ve hiçbir kontrol yapmaz. Yani tek tırnak kullandığınız değişkenlerde n gibi özel karakterler ve değişkenler kullanamazsınız. Tek tırnaklı string'de kontrol yapılmadığı için hızlı çalıştığından eğer başka değişken kulllanmayacaksanız ve özel karakter kullanmayacaksanız tek tırnak kullanmanız daha doğrudur.
Dosya çağırmak (include) : Program yazarken dosya çağırmaya ihtiyaç 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 çağırılıp çağırılmadığını kontrol eder. Çağrılmışsa yeniden çağırmaz. Eğer bir dosyayı birden fazla çağı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) : Bütün programlamlar çalışırken kullandığınız değişkenleri hafızada tutar. Hafızayı mümkün olduğu kadar az kullanmak için 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 parçalama 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ı şöyle 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 için 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 özelliği başka bir özellik kullanırak bulunabiliyorsa yani bağımlı ise bu özelliği alan olarak tabloda belirtmeye gerek yoktur.
Aynı özellikte bilgiler için tek tablo oluşturulmalıdır.
Sorgu: Sorgu cümlesi iyi oluşturulmalı ve istenilen sonuçların her zaman doğru olarak döndürüldüğü 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ı mümkün olduğu kadar azaltılmalıdır. Bunun için sorgu işlemleri farklı modüllere bölünebilir.
Sorguda sadece gerekli alanlar çekilmelidir ve 'select *' kullanımından kaçınılmalıdır.
Veritabanına veri girişi yaparken yapılan kontrolleri mümkün olduğu kadar veri tabanına yapmasını sağlamak. Veri tutarlığını çok özel durumlar olmadığı sürece veritabanı araçlarıyla sağlamak (trigger). Veritabanları bu işlemleri yapmak için tasarlandığı için sizin yazacağınız programlardan çok daha hızlı ve kolayca bu işlemleri hallederler. Unutmayalımki veritabanları sadece veri depolamak için değil veriyi kolay işlemek için kullanılmak içindir.
Kaynakça:
1)http://tr2.php.net/manual/en/function.echo.php
2)www.php.net
3)www.phpbuilder.com
4)www.bendevar.com
alıntı: yazilimci.org
PHP gibi ağ tabanlı çok kullanıcılı sistemler için kullanılan programlama dillerinde bu ölçülere daha çok dikkat edilmelidir. Ağ tabanlı uygulamaların masaüstü uygulamalarından en önemli farkı aynı anda farklı yerlerden bir çok kullanıcı tarafından çalıştırılacak olmalarıdır. Bu durumda yapılan bir fazla zaman yada sistem kaynağı kullanımı daha çok etkisini gösterecektir.
Bu yazıda PHP ile program/betik yazarken daha iyi bir performans için dikkat edilebilecek bazı ayrıntılardan bahsedeceğim.
Yazdığınız kodları performans açısından değerlendirirken dikkat etmeniz gereken üç temel konu vardır;
1) Kullandığınız dilin (Yazıda PHP kullanılacaktır) araçları
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 araçları : Programlama dilleri program yazarken kullanmanız için bir sürü fonksiyon (echo(), substr() ) ve araçlar (if,while, for) sağlarlar. Bu araçların kullanım amaçları farklı farklıdır. Aynı işi farklı araçlar kullanarak farklı yollarla yapabilirsiniz. Her farklı yolun harcadığı zaman farklıdır. Burada zamandan kastımız kodun çalış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 görebilirsiniz. Daha ayrıntılı ve detaylı bilgiyi Benchmark (PEAR), DBG, Xdebug veya Advanced PHPDebugger kullanarak elde edebilirsiniz. Bu konumuzun biraz dışında .
Şimdi PHP araçları kullanırken dikkat edebileceğimiz ufak ayrıntıları listelemeye başlayalım.
Aynı işi birkaç defa yapmamak : Aynı işlemi aynı sonucu verecekse tekrar yapmak zaman kaybıdır. Kod yazarken örneğin bugünün tarihi betiğin birkaç 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,çıkarma,eşitleme gibi) daha çok zaman aldığı için çok fazla kullanmak doğru değildir. Örneğin aynı şarta bağlı işlemleri bir araya toplamanız daha doğru olacaktır.
Döngüleri (for, while ...) doğru kullanmak : Döngüler de karar mekanizmaları gibi normal işlemlerden daha çok vakit alırlar çünkü her işlem sırasında döngü şartını kontrol ederler. Basit bir örnek vermek gerekirse 3 defa çalışacağını bildiğimiz bir döngü gereksizdir. Onun yerine direk olarak işlemi üç defa yazmamız daha doğrudur. Eğer bir döngünün kesin olarak kaç defa çalışacağını biliyorsak direk olarak işlemeleri yazmamız bize hız kazandıracaktır. Dögüleri kullanırken sık yapılan hatalardan biri de kontrol şartlarında aynı işlemi sürekli yaptırmaktır. Genel olarak döngülerde dizi (array) kullanırken döngüyü dizi sayısı kadar döndürürüz (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). Sonuç yazdırken echo kullanmak daha doğru olacaktır.
String türünde değişkenleri tek yada çift tırnak kullanmak : Tek tırnak kullandığınız zaman PHP motoru değişkeni formatsız olarak kabul eder ve hiçbir kontrol yapmaz. Yani tek tırnak kullandığınız değişkenlerde n gibi özel karakterler ve değişkenler kullanamazsınız. Tek tırnaklı string'de kontrol yapılmadığı için hızlı çalıştığından eğer başka değişken kulllanmayacaksanız ve özel karakter kullanmayacaksanız tek tırnak kullanmanız daha doğrudur.
Dosya çağırmak (include) : Program yazarken dosya çağırmaya ihtiyaç 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 çağırılıp çağırılmadığını kontrol eder. Çağrılmışsa yeniden çağırmaz. Eğer bir dosyayı birden fazla çağı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) : Bütün programlamlar çalışırken kullandığınız değişkenleri hafızada tutar. Hafızayı mümkün olduğu kadar az kullanmak için 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 parçalama 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ı şöyle 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 için 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 özelliği başka bir özellik kullanırak bulunabiliyorsa yani bağımlı ise bu özelliği alan olarak tabloda belirtmeye gerek yoktur.
Aynı özellikte bilgiler için tek tablo oluşturulmalıdır.
Sorgu: Sorgu cümlesi iyi oluşturulmalı ve istenilen sonuçların her zaman doğru olarak döndürüldüğü 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ı mümkün olduğu kadar azaltılmalıdır. Bunun için sorgu işlemleri farklı modüllere bölünebilir.
Sorguda sadece gerekli alanlar çekilmelidir ve 'select *' kullanımından kaçınılmalıdır.
Veritabanına veri girişi yaparken yapılan kontrolleri mümkün olduğu kadar veri tabanına yapmasını sağlamak. Veri tutarlığını çok özel durumlar olmadığı sürece veritabanı araçlarıyla sağlamak (trigger). Veritabanları bu işlemleri yapmak için tasarlandığı için sizin yazacağınız programlardan çok daha hızlı ve kolayca bu işlemleri hallederler. Unutmayalımki veritabanları sadece veri depolamak için değil veriyi kolay işlemek için kullanılmak içindir.
Kaynakça:
1)http://tr2.php.net/manual/en/function.echo.php
2)www.php.net
3)www.phpbuilder.com
4)www.bendevar.com
alıntı: yazilimci.org
Konular
- NMAP nedir?
- Port Scanning
- cPanel Kurulumu
- Uzak Masaüstü Bağlantısı - Remote Desktop Connection
- AWBS Nedir?
- Awbs Hakkinda Detayli Bilgiler Dersler
- Confixx Admin sifresini unutursak?
- SSH ile Cron Yöntemi ile Otomatik Sql yedeklemek
- Linux ROOT Sifresi degistirme
- Domain Backorder
- Dikkat kredi kartı şebekesi-tuzaklarında hostingcilerde var
- Babylon Sözlük 729 adet
- MySql Şifresini Resetlemek
- htaccess'te Queriy_string islemleri ve gönderme
- htaccess ile bir yerdeki birdne cok domaini calistirmak
- SoftException in Application.cpp:302 (Error500) düzenleme
- Root girisli yüklenen drupal dil ve diger eklenti hatalari
- linux serverde yeni ip ekleme islemi
- Web Sitem Güvendemi?
- Linux üzerine site ve forumlar
- Linux recovery üzerinden harddisk baglama (mount)
- SQL Sorgusunda saat ve haftaya göre aratma (DAYOFWEEK)
- Submit JavaScript ile formda nasıl yapılabilir
- Gönderme FORM un da resim kullanma
- Java script ile form verilerini kontrol edebilme
- Size Teşekkür Edenler Var!
- Flash ile grafiksel gösterimler (charts)
- MySQL Replikasyon İşlemi
- Çoklu MySQL Veritabanı Tamir Etme
- Templates Siteleri