Kendimi kullanılamayan benzersiz bir durumda buldum instanceof
(özellikle isim özellikli özellikler) ve kısa isme mümkün olan en verimli şekilde ihtiyacım vardı , bu yüzden kendime küçük bir kıyaslama yaptım. Bu sorudaki cevapların tüm farklı yöntemlerini ve varyasyonlarını içerir.
$bench = new \xori\Benchmark(1000, 1000); # https://github.com/Xorifelse/php-benchmark-closure
$shell = new \my\fancy\namespace\classname(); # Just an empty class named `classname` defined in the `\my\fancy\namespace\` namespace
$bench->register('strrpos', (function(){
return substr(static::class, strrpos(static::class, '\\') + 1);
})->bindTo($shell));
$bench->register('safe strrpos', (function(){
return substr(static::class, ($p = strrpos(static::class, '\\')) !== false ? $p + 1 : 0);
})->bindTo($shell));
$bench->register('strrchr', (function(){
return substr(strrchr(static::class, '\\'), 1);
})->bindTo($shell));
$bench->register('reflection', (function(){
return (new \ReflectionClass($this))->getShortName();
})->bindTo($shell));
$bench->register('reflection 2', (function($obj){
return $obj->getShortName();
})->bindTo($shell), new \ReflectionClass($shell));
$bench->register('basename', (function(){
return basename(str_replace('\\', '/', static::class));
})->bindTo($shell));
$bench->register('explode', (function(){
$e = explode("\\", static::class);
return end($e);
})->bindTo($shell));
$bench->register('slice', (function(){
return join('',array_slice(explode('\\', static::class), -1));
})->bindTo($shell));
print_r($bench->start());
Bütün sonucun bir listesi olduğunu burada ama burada önemli noktaları şunlardır:
- Eğer sen zaten kullanım yansıması gidiyoruz kullanarak
$obj->getShortName()
en hızlı yöntemdir ancak ; yansıma sadece kısa adı almak için kullanmak neredeyse en yavaş yöntemdir.
'strrpos'
nesne bir isim alanında değilse yanlış bir değer döndürebilir bu yüzden 'safe strrpos'
biraz daha yavaş ise bu kazanan olduğunu söyleyebilirim.
- Yapmak için
'basename'
Linux ve Windows arasında uyumlu sen kullanımına gerek str_replace()
bu yöntemi hepsini yavaş yapar.
Basitleştirilmiş bir sonuç tablosu, en yavaş yönteme kıyasla hız ölçülür:
+-----------------+--------+
| registered name | speed |
+-----------------+--------+
| reflection 2 | 70.75% |
| strrpos | 60.38% |
| safe strrpos | 57.69% |
| strrchr | 54.88% |
| explode | 46.60% |
| slice | 37.02% |
| reflection | 16.75% |
| basename | 0.00% |
+-----------------+--------+