빨리 해
저수준 통화는 매우 빨라야 하므로 조사 할 가치가 있다고 생각했습니다. 몇 가지 방법 (다양한 문자열 길이, 확장 길이, 여러 번 실행)을 시도했지만 합리적인 방법이 있습니다.
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);
}