ทำได้เร็วขึ้น
การโทรระดับต่ำต้องเร็วมากดังนั้นฉันคิดว่ามันคุ้มค่ากับการวิจัย ฉันลองสองสามวิธี (ด้วยความยาวของสตริงที่หลากหลายความยาวของส่วนขยายหลาย ๆ ตัววิ่ง) ต่อไปนี้เป็นวิธีที่สมเหตุสมผล:
function method1($s) {return preg_replace("/.*\./","",$s);} // edge case problem
function method2($s) {preg_match("/\.([^\.]+)$/",$s,$a);return $a[1];}
function method3($s) {$n = strrpos($s,"."); if($n===false) return "";return substr($s,$n+1);}
function method4($s) {$a = explode(".",$s);$n = count($a); if($n==1) return "";return $a[$n-1];}
function method5($s) {return pathinfo($s, PATHINFO_EXTENSION);}
ผลลัพธ์
ไม่น่าประหลาดใจมาก แย่pathinfo
คือ (โดยไกล!) ที่ช้าที่สุด (ดูเหมือนว่าเขากำลังพยายามแยกสิ่งทั้งหมดแล้ววางส่วนที่ไม่จำเป็นทั้งหมด) - และmethod3()
(strrpos) นั้นเร็วที่สุดโดยไกล:
Original filename was: something.that.contains.dots.txt
Running 50 passes with 10000 iterations each
Minimum of measured times per pass:
Method 1: 312.6 mike (response: txt) // preg_replace
Method 2: 472.9 mike (response: txt) // preg_match
Method 3: 167.8 mike (response: txt) // strrpos
Method 4: 340.3 mike (response: txt) // explode
Method 5: 2311.1 mike (response: txt) // pathinfo <--------- poor fella
หมายเหตุ: วิธีแรกมีผลข้างเคียง: มันจะคืนค่าชื่อเต็มเมื่อไม่มีส่วนขยาย แน่นอนว่ามันจะไม่สมเหตุสมผลที่จะวัดด้วย strpos เพิ่มเติมเพื่อหลีกเลี่ยงพฤติกรรมนี้
ข้อสรุป
ดูเหมือนว่าวิถีของซามูไร:
function fileExtension($s) {
$n = strrpos($s,".");
return ($n===false) ? "" : substr($s,$n+1);
}