Statik yöntemler vs işlevlerine performans

7 Cevap php

PHP, (i aslında ne düşündüğünü aksine) Orada basit fonksiyonları vs statik yöntemlerini çağırarak bir yükü.

On a very simple bench, this overhead is over 30% of the calling time (the method just returns the parameter):

// bench static method
$starttime = microtime(true);
for ($i = 0; $i< 10*1000*1000; $i++)
	SomeClass::doTest($i);

echo "Static Time:   " , (microtime(true)-$starttime) , " ms\n";

// bench object method
$starttime = microtime(true);

for ($i = 0; $i< 10*1000*1000; $i++)
	$someObj->doTest($i);

echo "Object Time:   " , (microtime(true)-$starttime) , " ms\n";

// bench function
$starttime = microtime(true);

for ($i = 0; $i< 10*1000*1000; $i++)
	something_doTest($i);

echo "Function Time: " , (microtime(true)-$starttime) , " ms\n";

çıkışlar:

Static Time:   0.640204906464 ms
Object Time:   0.48961687088 ms
Function Time: 0.438289880753 ms

Ben aslında bir şey, 1 milyon kez arıyorum sürece gerçek zaman hala önemsiz olduğunu biliyorum, ama aslında onun orada olduğunu.

Herkes denemek ve sahne arkasında neler olduğunu açıklamak ister misin?

update:
- added object method bench

7 Cevap

Orada statik bir yöntem çağrılırken büyük bir ceza olarak kullanılan - ama 5.4.0 de sabit - kapsamlı test sonuçlarını görmek http://www.micro-optimization.com/global-function-vs-static-method.

Benim makine birden çok kez testi tekrarladı ve şaşırtıcı you are right!

In PHP calling methods of static sınıf nesnesi yöntemleri çağırmadan daha yavaş gibi görünüyor. Basit bir test için buraya tıklayın.

Koşu testi ile kod yukarıdaki bağlantıyı olduğunu.

I even tried placing both the objet method and the static method in the same class and the static yöntemi hala DUSUK Sonuçları!

Bu noktada ben devralma gecikmesi ekler beri ne kadar yavaş, devralınan bir sınıf bir static yöntemine bir çağrı olabilir merak ediyorum.

Ne yazık ki, nedeni hakkında clueless değilim. Maybe PHP takes more time in finding the definition of the static yöntemi .

Bir yan not olarak ben sadece bir gerçek hayat uygulamada genellikle nesnenin yöntemlerinden birini çağırmadan önce oluşturulan sahip olur söyleyebiliriz. Onun için test her zaman (ya da en azından some times) [*] Nesneyi oluşturan bir döngü statik aramaların döngü karşılaştırarak bunu dikkate almalıdır:

for($i=0; $i<10*1000*1000; $i++)
{ 
   $someObj = new someObj();
   $someObj->doTest($i); 
}

böylece belli static çağrı daha yavaştır.

for($i=0; $i<10*1000*1000; $i++)
{ 
   SomeClass::doTest($i);
}

[*] Sorun: Bir gerçek dünya app happnes ne simüle etmek için some times ne kadar? Bunu söylemek zor!

Ben herhangi bir PHP yaptım çünkü bir süre oldu ama bu muhtemelen diğer programlama ortamlarında beklemek ne benzer.

Bu fonksiyon sadece herhangi bir başlangıç ​​maliyeti olmadan çalıştırılabilir ise statik yöntem, perde denir her zaman arkasında bir SomeClass nesnenin bazı inşaat gerektirir muhtemeldir. Bir çöp toplayıcı / referans sayaç tarafından mevcut objeleri imha, bellek baskısı neden parçalanma, C çalışma zamanı vb optimal bellek ayırma politikaları: Bir nesneyi could şeyler sayısına bağlı olarak pahalı olabilir oluşturma

Bu varolan bir nesne yöntemi performansını karşılaştırmak ilginç olacaktır. Bunu yapmak için birSınıf bir örneğini oluşturmak ve daha sonra tekrar bir örnek yöntemini çağırın.

Statik yöntemi durumunda, PHP veya arama bağlamında (public, protected, özel) çağrılabilir edemeyeceğini yöntemine wether kontrol etmek için vardır. Klasik işlev çağrısı kontrolü bu tür gerçekleştirmek için PHP gerektirmez beri, havai ne neden büyük olasılıkla, ya da en azından bir kısmı.

Sizin testlerde yanlış bir şey yoktur. Aynı anda birden fazla kullanıcı ile çalışmak üzere tasarlanmış bir web sitesi ile, her biri için bir nesne oluşturmak zorunda. Eğer olması gereken sizin testlerde o nesnenin yöntemini çalıştırmak için:

for($i=0; $i<10*1000*1000; $i++)
{ 
   $someObj = new someObj();
   $someObj->doTest($i); 
}

Nesne sonra daha oluşturma özellikleri ve yöntemleri olsaydı daha yavaş ve PHP daha fazla bellek kullanır. Statik bir yöntem bu sorun var ve bu nedenle statik yöntemler kullanarak durumlarda çok daha iyi bir seçimdir olmaz. Örneğin, ortak görevler için statik yöntemler ile bazı kullanışlı araçları ile bir sınıf.

http://www.webhostingtalk.com/showthread.php?t=538076: İşte bu kavramlardan bazıları arasındaki performans farklılıkları anlatılır bir makale

Bu konuda bakım gerekmez. Bunu yaparsanız, bu sizin sisteminizi tasarlarken yanlış bir şey yapmış demektir. Bir performans başka yollar kullanarak artırılabilir için denenmelidir.