Tôi thấy mình trong một tình huống duy nhất instanceof
không thể sử dụng (đặc biệt là các đặc điểm được đặt tên) và tôi cần tên ngắn theo cách hiệu quả nhất có thể nên tôi đã tự mình thực hiện một số điểm chuẩn nhỏ. Nó bao gồm tất cả các phương pháp & biến thể khác nhau từ các câu trả lời trong câu hỏi này.
$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());
Một danh sách của toàn bộ kết quả có ở đây nhưng đây là những điểm nổi bật:
- Tuy nhiên , nếu bạn định sử dụng phản xạ, thì sử dụng
$obj->getShortName()
là phương pháp nhanh nhất ; sử dụng phản chiếu chỉ để có được những tên viết tắt nó gần như là phương pháp chậm nhất.
'strrpos'
có thể trả về một giá trị sai nếu đối tượng không ở trong một không gian tên vì vậy trong khi 'safe strrpos'
chậm hơn một chút tôi sẽ nói đây là người chiến thắng.
- Để
'basename'
tương thích giữa Linux và Windows, bạn cần sử dụng str_replace()
phương pháp này làm cho phương thức này chậm nhất.
Một bảng kết quả được đơn giản hóa, tốc độ được đo so với phương pháp chậm nhất:
+-----------------+--------+
| 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% |
+-----------------+--------+