ฉันพบว่าตัวเองตกอยู่ในสถานการณ์ที่instanceof
ไม่สามารถใช้งานได้ (โดยเฉพาะลักษณะที่กำหนดชื่อเฉพาะ) และฉันต้องการชื่อสั้น ๆ ในวิธีที่มีประสิทธิภาพที่สุดเท่าที่จะเป็นไปได้เพื่อที่ฉันจะได้สร้างมาตรฐานของตัวเอง มันมีวิธีการและรูปแบบที่แตกต่างกันทั้งหมดจากคำตอบในคำถามนี้
$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());
รายการผลลัพธ์ทั้งหมดอยู่ที่นี่แต่นี่คือไฮไลท์:
- หากคุณกำลังจะสะท้อนการใช้ anyways ใช้
$obj->getShortName()
เป็นวิธีที่เร็วที่สุดอย่างไรก็ตาม ; ใช้การสะท้อนเพียงเพื่อให้ได้ชื่อสั้น ๆ มันเกือบจะเป็นวิธีที่ช้าที่สุด
'strrpos'
สามารถคืนค่าผิดถ้าวัตถุไม่อยู่ใน namespace ดังนั้นในขณะที่'safe strrpos'
ช้าลงเล็กน้อยฉันจะบอกว่านี่เป็นผู้ชนะ
- เพื่อให้
'basename'
เข้ากันได้ระหว่าง Linux และ Windows คุณต้องใช้str_replace()
ซึ่งทำให้วิธีนี้ช้าที่สุด
ตารางผลลัพธ์ที่ง่ายขึ้นมีการวัดความเร็วเมื่อเปรียบเทียบกับวิธีที่ช้าที่สุด:
+-----------------+--------+
| 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% |
+-----------------+--------+