여러 개의 경계가 있는 explode 중 어느 것이 빠릅니까
17137 단어 PHP
결론
preg_split
고속화.우세를 점하다.mb_split
고속.PHP7의 큰 변동이 보이지 않습니다.explode
는 모든 버전에서 상대적으로 안정적인 좋은 속도를 낸다.전언
고맙습니다.xdebug로 조사하면 데이터베이스 조작과 프레임워크의 시작이 주도적인 위치를 차지하고 작은 손의 속도 개선이 공허해진다.
투고 시간을 기다리면서 제때에 댓글을 남겨주세요.
PHP로 빠른 코드를 쓰고 싶을 때의 노트. - 댓글. - Qita.
있어. 거기다 둬.
이런 말은 매우 진지할 뿐만 아니라, 접힌 흔적도 볼 수 있다.
하지만 ms 단위라도 빠른 처리를 찾는 것은 간단하고 즐겁다.1
'받아들이기'가 모든 것보다 우선이다!!어렵다는 말이 있긴 하지만 너무 집착하지 말고 너무 과하게 하지 마라.
그리고 일반 아마추어의 기준은 완비되지 않은 부분이 있다.
나는 나의 이 보도 자체도'수용','선택'의 자료로 사귀어야 한다고 생각한다.
개요
함수는 하나의 정계자만 받아들인다.
더욱 유연한 분할 함수는 explode
와 preg_split
가 있지만 모두 정규 표현식을 사용한다.
확실히'A 또는 B는 정계부호이다'는 정규 표현식의 범주에 속하지만 일반적으로 정규 표현은 비교적 느리다.
반면, mb_split
사용자 노트에서는 정렬에 따라 경계를 받아들일 수 있는 함수를 만드는 방법을 소개했다.2
복잡한 정규 표현식의 힘이 필요 없는 단순한 정계부, 단순한 대상 스트링의 경우 어느 것이 더 빠른지 검증했다.
아울러 고대로부터 이어져 온 회귀식explode
의 성능도 조사했다.
환경을 조사하다
경계 문자, 분할 대상explode
에서 사용array(",",".","|",":")
"here is a sample: this text, and this will be exploded. this also | this one too :)"
.
이동 코드로 하는 곳.
3v4l thx 3v4l로 PHP 동작 검증
를 참고하십시오.
실행 시간 측정
lavoiesl/php-benchmark: Tool to compare different functions in PHP
.
각종 파일은 복사 붙여넣기로 3v4l에 붙여넣은 후 이동합니다.
테스트 코드
/*
php-benchmarkのクラス記述省略
*/
$benchmark = new Benchmark;
function multiexplode ($delimiters,$string)
{
$ready = str_replace($delimiters, $delimiters[0], $string);
$launch = explode($delimiters[0], $ready);
return $launch;
}
function homemadeexplode($splitter, $str)
{
$return = [];
if (is_array($splitter) == true) {
foreach ($splitter as $sp) {
$str = homemadeexplode($sp, $str);
}
$return = $str;
} else {
if (is_array($str) == true) {
foreach ($str as $st) {
$tmp = explode($splitter, $st);
$return = array_merge($return, $tmp);
}
} else {
$return = explode($splitter, $str);
}
}
return $return;
}
$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";
$benchmark->add('multiexplode', function() use($text) { return multiexplode( [",",".","|",":"], $text); });
$benchmark->add('homemadeExplode', function() use($text) { return homemadeexplode([",",".","|",":"], $text); });
$benchmark->add('preg_split', function() use($text) { return preg_split( '/[,.|:]/', $text); });
$benchmark->add('mb_split', function() use($text) { return mb_split( '[,.|:]', $text); });
$benchmark->setCount(50000);
$benchmark->run();
결실
multiexplode
보기 드문 것은 속도가 떨어지는 것이다. 이번 최신 7.2는 나쁜 것 같다.
5.6까지mb_split
비preg_split
는 현저히 늦었지만 7.0 고속화 이후 역전됐다.mb_split
거의 안정적으로 2위를 유지하고 있다.
텍스트에 여러 바이트를 포함해도 바뀌지 않습니다.
https://3v4l.org/4Cec9#output
추가: 경계가 하나밖에 없으면?
코드
일반적인 explode를 추가했습니다.$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";
$benchmark->add('multiexplode', function() use($text) { return multiexplode( [","], $text); });
$benchmark->add('homemadeExplode', function() use($text) { return homemadeexplode([","], $text); });
$benchmark->add('preg_split', function() use($text) { return preg_split( '/,/', $text); });
$benchmark->add('mb_split', function() use($text) { return mb_split( ',', $text); });
$benchmark->add('explode', function() use($text) { return explode( ',', $text); });
$benchmark->setCount(50000);
$benchmark->run();
결실
응, 나도 네가 뭘 하고 싶은지 모르겠어.
물론 multiexplode
가 가장 빠르고 explode
는 모든 버전에서 상대적으로 빠르다.preg_split
보다 빠른, 역시 오차
원래부터 신경 쓰였는데explode
한 자릿수 ms~2자릿수 ms의 큰 파동이 있었다.
최고의 검증
경계부호가 없을 때explode
검증
multixplode의 주의점은?
'multipexplode'의 경계부호는string의 한 글자라도 억지로 움직일 수 있지만 여러 글자나 여러 바이트라면 str_split
로 대체하기 때문에 하나라도 미리 배열해야 한다.힌지
총결산
이번에도 다용도의 값으로 테스트를 하지 않았기 때문에 단순히 믿을 수는 없다.
아울러 유령차와 PCRE도 미리 배치한다.
바삭하지 않고 PHP7이면 아무 생각도 안 하고 전체$delimiters[0]
도 돼요.
한 글자의 정규 표현식 패턴이 좋지 않으면 간단하게 preg_split
와explode
를 병용할 수 있다.
5.6 이전에는 preg_split
와 explode
를 병용하면 쉽게 알 수 있었을까.
함수는 하나의 정계자만 받아들인다.
더욱 유연한 분할 함수는
explode
와 preg_split
가 있지만 모두 정규 표현식을 사용한다.확실히'A 또는 B는 정계부호이다'는 정규 표현식의 범주에 속하지만 일반적으로 정규 표현은 비교적 느리다.
반면,
mb_split
사용자 노트에서는 정렬에 따라 경계를 받아들일 수 있는 함수를 만드는 방법을 소개했다.2복잡한 정규 표현식의 힘이 필요 없는 단순한 정계부, 단순한 대상 스트링의 경우 어느 것이 더 빠른지 검증했다.
아울러 고대로부터 이어져 온 회귀식
explode
의 성능도 조사했다.환경을 조사하다
경계 문자, 분할 대상explode
에서 사용array(",",".","|",":")
"here is a sample: this text, and this will be exploded. this also | this one too :)"
.
이동 코드로 하는 곳.
3v4l thx 3v4l로 PHP 동작 검증
를 참고하십시오.
실행 시간 측정
lavoiesl/php-benchmark: Tool to compare different functions in PHP
.
각종 파일은 복사 붙여넣기로 3v4l에 붙여넣은 후 이동합니다.
테스트 코드
/*
php-benchmarkのクラス記述省略
*/
$benchmark = new Benchmark;
function multiexplode ($delimiters,$string)
{
$ready = str_replace($delimiters, $delimiters[0], $string);
$launch = explode($delimiters[0], $ready);
return $launch;
}
function homemadeexplode($splitter, $str)
{
$return = [];
if (is_array($splitter) == true) {
foreach ($splitter as $sp) {
$str = homemadeexplode($sp, $str);
}
$return = $str;
} else {
if (is_array($str) == true) {
foreach ($str as $st) {
$tmp = explode($splitter, $st);
$return = array_merge($return, $tmp);
}
} else {
$return = explode($splitter, $str);
}
}
return $return;
}
$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";
$benchmark->add('multiexplode', function() use($text) { return multiexplode( [",",".","|",":"], $text); });
$benchmark->add('homemadeExplode', function() use($text) { return homemadeexplode([",",".","|",":"], $text); });
$benchmark->add('preg_split', function() use($text) { return preg_split( '/[,.|:]/', $text); });
$benchmark->add('mb_split', function() use($text) { return mb_split( '[,.|:]', $text); });
$benchmark->setCount(50000);
$benchmark->run();
결실
multiexplode
보기 드문 것은 속도가 떨어지는 것이다. 이번 최신 7.2는 나쁜 것 같다.
5.6까지mb_split
비preg_split
는 현저히 늦었지만 7.0 고속화 이후 역전됐다.mb_split
거의 안정적으로 2위를 유지하고 있다.
텍스트에 여러 바이트를 포함해도 바뀌지 않습니다.
https://3v4l.org/4Cec9#output
추가: 경계가 하나밖에 없으면?
코드
일반적인 explode를 추가했습니다.$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";
$benchmark->add('multiexplode', function() use($text) { return multiexplode( [","], $text); });
$benchmark->add('homemadeExplode', function() use($text) { return homemadeexplode([","], $text); });
$benchmark->add('preg_split', function() use($text) { return preg_split( '/,/', $text); });
$benchmark->add('mb_split', function() use($text) { return mb_split( ',', $text); });
$benchmark->add('explode', function() use($text) { return explode( ',', $text); });
$benchmark->setCount(50000);
$benchmark->run();
결실
응, 나도 네가 뭘 하고 싶은지 모르겠어.
물론 multiexplode
가 가장 빠르고 explode
는 모든 버전에서 상대적으로 빠르다.preg_split
보다 빠른, 역시 오차
원래부터 신경 쓰였는데explode
한 자릿수 ms~2자릿수 ms의 큰 파동이 있었다.
최고의 검증
경계부호가 없을 때explode
검증
multixplode의 주의점은?
'multipexplode'의 경계부호는string의 한 글자라도 억지로 움직일 수 있지만 여러 글자나 여러 바이트라면 str_split
로 대체하기 때문에 하나라도 미리 배열해야 한다.힌지
총결산
이번에도 다용도의 값으로 테스트를 하지 않았기 때문에 단순히 믿을 수는 없다.
아울러 유령차와 PCRE도 미리 배치한다.
바삭하지 않고 PHP7이면 아무 생각도 안 하고 전체$delimiters[0]
도 돼요.
한 글자의 정규 표현식 패턴이 좋지 않으면 간단하게 preg_split
와explode
를 병용할 수 있다.
5.6 이전에는 preg_split
와 explode
를 병용하면 쉽게 알 수 있었을까.
array(",",".","|",":")
"here is a sample: this text, and this will be exploded. this also | this one too :)"
/*
php-benchmarkのクラス記述省略
*/
$benchmark = new Benchmark;
function multiexplode ($delimiters,$string)
{
$ready = str_replace($delimiters, $delimiters[0], $string);
$launch = explode($delimiters[0], $ready);
return $launch;
}
function homemadeexplode($splitter, $str)
{
$return = [];
if (is_array($splitter) == true) {
foreach ($splitter as $sp) {
$str = homemadeexplode($sp, $str);
}
$return = $str;
} else {
if (is_array($str) == true) {
foreach ($str as $st) {
$tmp = explode($splitter, $st);
$return = array_merge($return, $tmp);
}
} else {
$return = explode($splitter, $str);
}
}
return $return;
}
$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";
$benchmark->add('multiexplode', function() use($text) { return multiexplode( [",",".","|",":"], $text); });
$benchmark->add('homemadeExplode', function() use($text) { return homemadeexplode([",",".","|",":"], $text); });
$benchmark->add('preg_split', function() use($text) { return preg_split( '/[,.|:]/', $text); });
$benchmark->add('mb_split', function() use($text) { return mb_split( '[,.|:]', $text); });
$benchmark->setCount(50000);
$benchmark->run();
결실
multiexplode
보기 드문 것은 속도가 떨어지는 것이다. 이번 최신 7.2는 나쁜 것 같다.
5.6까지mb_split
비preg_split
는 현저히 늦었지만 7.0 고속화 이후 역전됐다.mb_split
거의 안정적으로 2위를 유지하고 있다.
텍스트에 여러 바이트를 포함해도 바뀌지 않습니다.
https://3v4l.org/4Cec9#output
추가: 경계가 하나밖에 없으면?
코드
일반적인 explode를 추가했습니다.$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";
$benchmark->add('multiexplode', function() use($text) { return multiexplode( [","], $text); });
$benchmark->add('homemadeExplode', function() use($text) { return homemadeexplode([","], $text); });
$benchmark->add('preg_split', function() use($text) { return preg_split( '/,/', $text); });
$benchmark->add('mb_split', function() use($text) { return mb_split( ',', $text); });
$benchmark->add('explode', function() use($text) { return explode( ',', $text); });
$benchmark->setCount(50000);
$benchmark->run();
결실
응, 나도 네가 뭘 하고 싶은지 모르겠어.
물론 multiexplode
가 가장 빠르고 explode
는 모든 버전에서 상대적으로 빠르다.preg_split
보다 빠른, 역시 오차
원래부터 신경 쓰였는데explode
한 자릿수 ms~2자릿수 ms의 큰 파동이 있었다.
최고의 검증
경계부호가 없을 때explode
검증
multixplode의 주의점은?
'multipexplode'의 경계부호는string의 한 글자라도 억지로 움직일 수 있지만 여러 글자나 여러 바이트라면 str_split
로 대체하기 때문에 하나라도 미리 배열해야 한다.힌지
총결산
이번에도 다용도의 값으로 테스트를 하지 않았기 때문에 단순히 믿을 수는 없다.
아울러 유령차와 PCRE도 미리 배치한다.
바삭하지 않고 PHP7이면 아무 생각도 안 하고 전체$delimiters[0]
도 돼요.
한 글자의 정규 표현식 패턴이 좋지 않으면 간단하게 preg_split
와explode
를 병용할 수 있다.
5.6 이전에는 preg_split
와 explode
를 병용하면 쉽게 알 수 있었을까.
코드
일반적인 explode를 추가했습니다.
$text = "here is a sample: this text, and this will be exploded. this also | this one too :)";
$benchmark->add('multiexplode', function() use($text) { return multiexplode( [","], $text); });
$benchmark->add('homemadeExplode', function() use($text) { return homemadeexplode([","], $text); });
$benchmark->add('preg_split', function() use($text) { return preg_split( '/,/', $text); });
$benchmark->add('mb_split', function() use($text) { return mb_split( ',', $text); });
$benchmark->add('explode', function() use($text) { return explode( ',', $text); });
$benchmark->setCount(50000);
$benchmark->run();
결실
응, 나도 네가 뭘 하고 싶은지 모르겠어.
물론
multiexplode
가 가장 빠르고 explode
는 모든 버전에서 상대적으로 빠르다.preg_split
보다 빠른, 역시 오차원래부터 신경 쓰였는데
explode
한 자릿수 ms~2자릿수 ms의 큰 파동이 있었다.최고의 검증
경계부호가 없을 때explode
검증
multixplode의 주의점은?
'multipexplode'의 경계부호는string의 한 글자라도 억지로 움직일 수 있지만 여러 글자나 여러 바이트라면 str_split
로 대체하기 때문에 하나라도 미리 배열해야 한다.힌지
총결산
이번에도 다용도의 값으로 테스트를 하지 않았기 때문에 단순히 믿을 수는 없다.
아울러 유령차와 PCRE도 미리 배치한다.
바삭하지 않고 PHP7이면 아무 생각도 안 하고 전체$delimiters[0]
도 돼요.
한 글자의 정규 표현식 패턴이 좋지 않으면 간단하게 preg_split
와explode
를 병용할 수 있다.
5.6 이전에는 preg_split
와 explode
를 병용하면 쉽게 알 수 있었을까.
'multipexplode'의 경계부호는string의 한 글자라도 억지로 움직일 수 있지만 여러 글자나 여러 바이트라면
str_split
로 대체하기 때문에 하나라도 미리 배열해야 한다.힌지총결산
이번에도 다용도의 값으로 테스트를 하지 않았기 때문에 단순히 믿을 수는 없다.
아울러 유령차와 PCRE도 미리 배치한다.
바삭하지 않고 PHP7이면 아무 생각도 안 하고 전체$delimiters[0]
도 돼요.
한 글자의 정규 표현식 패턴이 좋지 않으면 간단하게 preg_split
와explode
를 병용할 수 있다.
5.6 이전에는 preg_split
와 explode
를 병용하면 쉽게 알 수 있었을까.
mb_split
와 이미 사용된 정규 표현식 함수*_split
,preg_match
등)와 상반된다mb_ereg_replace
도 시야에 들어오나요.성능에 신경을 쓰면 당연히 할 수 있는 점
multiexplode
이다.또한 개인도
explode
에서 사용preg_split
의 매개 변수를 주의해야 한다.(특히 $flag
없음PREG_SPLIT_NO_EMPTY
이럴 땐 아무거나 괜찮지만 이쪽은~별도의 지침이 없다면 당시 발견된 코드로 구현하면 전체적인 통일감을 잃을 수 있으니 유의하시기 바랍니다.속도도 빠르다.
explode와 split은 이미 통일감이 없어요.
어쨌든 회귀 함수는 필요 없겠지.
참고 자료
explode
괜찮아 보여요.눈도 못 떼게. ↩
Reference
이 문제에 관하여(여러 개의 경계가 있는 explode 중 어느 것이 빠릅니까), 우리는 이곳에서 더 많은 자료를 발견하고 링크를 클릭하여 보았다 https://qiita.com/khsk/items/ba5ebf62207f696ede53텍스트를 자유롭게 공유하거나 복사할 수 있습니다.하지만 이 문서의 URL은 참조 URL로 남겨 두십시오.
우수한 개발자 콘텐츠 발견에 전념 (Collection and Share based on the CC Protocol.)