Saya menemukan diri saya dalam situasi yang unik di mana instanceof
tidak dapat digunakan (khusus sifat-sifat namespace) dan saya membutuhkan nama pendek dengan cara yang paling efisien mungkin jadi saya telah melakukan tolok ukur sendiri. Ini mencakup semua metode & variasi yang berbeda dari jawaban dalam pertanyaan ini.
$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());
Daftar seluruh hasil ada di sini tetapi di sini adalah yang utama:
- Jika Anda akan menggunakan refleksi lagian, menggunakan
$obj->getShortName()
adalah metode tercepat namun ; menggunakan refleksi hanya untuk mendapatkan nama pendek itu adalah metode yang paling lambat.
'strrpos'
dapat mengembalikan nilai yang salah jika objek tidak ada dalam namespace jadi sementara 'safe strrpos'
sedikit lebih lambat saya akan mengatakan ini adalah pemenangnya.
- Untuk membuat
'basename'
kompatibel antara Linux dan Windows Anda harus menggunakan str_replace()
yang membuat metode ini paling lambat dari semuanya.
Tabel hasil yang disederhanakan, kecepatan diukur dibandingkan dengan metode paling lambat:
+-----------------+--------+
| 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% |
+-----------------+--------+