मैंने खुद को एक अनोखी स्थिति में पाया, जहां 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());
संपूर्ण परिणाम की एक सूची यहां है, लेकिन यहां पर प्रकाश डाला गया है:
- अगर आप वैसे भी उपयोग प्रतिबिंब लिए जा रहे हैं, का उपयोग करते हुए
$obj->getShortName()
सबसे तेज तरीका है लेकिन ; केवल संक्षिप्त नाम प्राप्त करने के लिए प्रतिबिंब का उपयोग करना लगभग सबसे धीमा तरीका है।
'strrpos'
यदि कोई नेमस्पेस में नहीं है तो एक गलत मान लौटा सकता है, जबकि 'safe strrpos'
एक छोटा सा धीमा है, मैं कहूंगा कि यह विजेता है।
'basename'
लिनक्स और विंडोज के बीच सुसंगत बनाने के लिए आपको उपयोग करने की आवश्यकता है 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% |
+-----------------+--------+