Nasıl verimli PHP tanımlamak mı?

9 Cevap php

# Define C + + önişlemci tamamen farklıdır.

PHP sadece bir var yaratarak daha farklı () tanımlamak mı?

define("SETTING", 0);  
$something = SETTING;

vs

$setting = 0;  
$something = $setting;

9 Cevap

'Tanımlamak' operasyonu kendisi oldukça yavaş - xdebug profiler tarafından doğrulandı.

Buradan kriterler olduğunu http://t3.dotgnu.info/blog/php/my-first-php-extension.html:

  • pure 'define'
    380.785 fetches/sec
    14.2647 mean msecs/first-response

  • constants defined with 'hidef' extension
    930.783 fetches/sec
    6.30279 mean msecs/first-response


broken link update

Yukarıda atıfta blog yazısı internet bıraktı. Hala görülebilir here via Wayback Machine. Burada başka bir similar article olduğunu.

Yazar referanslar here (apc_define_constants) ve here (hidef extension) bulunabilir kütüphaneler.

Burada farklar vardır manual dan

  • Sabitler onlardan önce bir dolar işareti ($) yok;
  • Sabitler sadece basit bir atama ile, define () fonksiyonu kullanılarak tanımlanabilir;
  • Sabitleri değişken etki alanı kurallarına bakılmaksızın belirlenen ve her yerde erişilebilir olabilir;
  • Sabitleri yeniden ya da kurulduktan sonra tanımsız olabilir; ve
  • Sabitler sadece sayısal değerler değerlendirmek olabilir.

Benim için, ana parası küresel kapsamı. Ben kesinlikle onların verimliliği konusunda endişe etmeyin - alterable olmamalıdır küresel bir skaler değer gerektiğinde kullanabilirsiniz.

Genel olarak, sabit bir fikri (komik geliyor, değil mi? ;)) Sizin program içinde, constant olmaktır. Hangi derleyici (yorumlayıcı) tüm betik boyunca Falanca değerine sahip "filanca" yerini alacak anlamına gelir.

Teori ve avantajları için çok - derlemek eğer. Şimdi PHP oldukça dinamik ve PHP komut dosyası her çalışma ile derlenmiş çünkü çoğu durumda farklı bir fark olmaz. Böyle APC, Zend Optimizer veya {[(2)] gibi bir byte kod önbelleği kullanmak sürece sabitler ve değişkenler arasındaki hız kayda değer bir fark göremiyorum gerekir Afai-söyleyebilirim }. Sonra mantıklı olabilir.

Sabitler tüm diğer avantajları / dezavantajları burada zaten not edilmiştir ve PHP manual bulunabilir.

php > $cat='';$f=microtime(1);$s='cowcow45';$i=9000;while ($i--){$cat.='plip'.$s.'cow';}echo microtime(1)-$f."\n";

,00689506530762

php > $cat='';$f=microtime(1);define('s','cowcow45');$i=9000;while ($i--){$cat.='plip'.s.'cow';}echo microtime(1)-$f."\n";

,00941896438599

Bu benzer sonuçlar ile tekrarlanabilir. Sabitler değişkenler daha tanımlamak ve / veya kullanmak için biraz yavaş gibi görünüyor bana.

Özgürce süreci boyunca onun değeri işleyebilirsiniz çünkü değişken dinamik anlamda ise değeri çalışma zamanında değiştirilemez, yani basit bir statik anlamda tanımlamak.

Verimli DEĞİL görünür. (Ve ben php.net itibaren bir yorumum burada tüm varsayımlarını dayandırarak ediyorum, ben hala kriterler kendim yaptım değil.)

Bir sabit hatırlatarak, bir değişken hatırlatarak zaman 2x alacaktır.

Bir Constant varlığını kontrol bir yanlış pozitif için 2ms ve 12ms alacak!

Php online doc tanımlayan sayfanın yorumlardan bir kriter bulunuyor.

Tanımlı kullanmadan önce () aşağıdaki kriterler bakabilirsiniz:

true                                       0.65ms
$true                                      0.69ms (1)
$config['true']                            0.87ms
TRUE_CONST                                 1.28ms (2)
true                                       0.65ms
defined('TRUE_CONST')                      2.06ms (3)
defined('UNDEF_CONST')                    12.34ms (4)
isset($config['def_key'])                  0.91ms (5)
isset($config['undef_key'])                0.79ms
isset($empty_hash[$good_key])              0.78ms
isset($small_hash[$good_key])              0.86ms
isset($big_hash[$good_key])                0.89ms
isset($small_hash[$bad_key])               0.78ms
isset($big_hash[$bad_key])                 0.80ms

PHP Sürüm 5.2.6, Apache 2.0, Windows XP

Each statement was executed 1000 times and while a 12ms overhead on 1000 calls isn't going to have the end users tearing their hair out, it does throw up some interesting results when comparing to if(true):

1) if($true) was virtually identical 2) if(TRUE_CONST) was almost twice as slow - I guess that the substitution isn't done at compile time (I had to double check this one!) 3) defined() is 3 times slower if the constant exists 4) defined() is 19 TIMES SLOWER if the constant doesn't exist! 5) isset() is remarkably efficient regardless of what you throw at it (great news for anyone implementing array driven event systems - me!)

Kaçınmak isteyebilirsiniz if () 'DEBUG' (tanımlanır) ...

26-Mar-2009 06:40 au nokta com nokta tfconsulting de tris + php

http://us.php.net/manual/en/function.defined.php#89886

Ben hız testleri çalıştırdığınızda, sabitler seti ve çok daha biraz daha hızlı değişkenleri belirleme ve onları damping daha çalıştırması dökülüyor.

Ana farklar:

  • tanımlayan sabit olduğu, değişken değişkendir
  • Farklı kapsam / görünürlük

Verimliliği konusunda emin değil, ama bu bir var oluşturarak daha fazladır:

  • Bu bir sabittir: Bu ayarı yeniden tanımlamak veya atayamazsın.
  • Tanımlamak bulunmazsa, $ şey i18n örneğin yararlıdır "AYARI", ayarlanır: Bir çeviri, biz büyük bir kelime (bkz yerelleştirme dosyasını tanımlamak olduğu tekabül yani) eksik Büyük harf, oldukça görülebilir ...