여러 개의 경계가 있는 explode 중 어느 것이 빠릅니까

17137 단어 PHP

결론

  • PHP7 이후preg_split 고속화.우세를 점하다.
  • PHP5.6 이전mb_split 고속.PHP7의 큰 변동이 보이지 않습니다.
  • 사용 교체explode는 모든 버전에서 상대적으로 안정적인 좋은 속도를 낸다.
  • 전언


    고맙습니다.xdebug로 조사하면 데이터베이스 조작과 프레임워크의 시작이 주도적인 위치를 차지하고 작은 손의 속도 개선이 공허해진다.
    투고 시간을 기다리면서 제때에 댓글을 남겨주세요.
    PHP로 빠른 코드를 쓰고 싶을 때의 노트. - 댓글. - Qita.
    있어. 거기다 둬.
    이런 말은 매우 진지할 뿐만 아니라, 접힌 흔적도 볼 수 있다.
    하지만 ms 단위라도 빠른 처리를 찾는 것은 간단하고 즐겁다.1
    '받아들이기'가 모든 것보다 우선이다!!어렵다는 말이 있긴 하지만 너무 집착하지 말고 너무 과하게 하지 마라.
    그리고 일반 아마추어의 기준은 완비되지 않은 부분이 있다.
    나는 나의 이 보도 자체도'수용','선택'의 자료로 사귀어야 한다고 생각한다.

    개요


    함수는 하나의 정계자만 받아들인다.
    더욱 유연한 분할 함수는 explodepreg_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_splitpreg_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_splitexplode를 병용할 수 있다.
    5.6 이전에는 preg_splitexplode를 병용하면 쉽게 알 수 있었을까.
  • 각 PHP 버전의 (성능 향상) 차이에 좌우되지 마십시오
  • 여러 개의 간단한 경계 문자가 빈번하게 나타난다(정규 표현식 사용하지 않음)
  • 성능이 좋다mb_split와 이미 사용된 정규 표현식 함수*_split,preg_match 등)와 상반된다
  • 언제mb_ereg_replace도 시야에 들어오나요.
    성능에 신경을 쓰면 당연히 할 수 있는 점multiexplode이다.
    또한 개인도 explode에서 사용preg_split의 매개 변수를 주의해야 한다.(특히 $flag없음PREG_SPLIT_NO_EMPTY이럴 땐 아무거나 괜찮지만 이쪽은~
    별도의 지침이 없다면 당시 발견된 코드로 구현하면 전체적인 통일감을 잃을 수 있으니 유의하시기 바랍니다.속도도 빠르다.
    explode와 split은 이미 통일감이 없어요.
    어쨌든 회귀 함수는 필요 없겠지.

    참고 자료

  • PHP: explode - Manual
  • PHP: preg_split - Manual
  • PHP: mb_split - Manual
  • php - preg_split vs mb_split - Stack Overflow
  • explode 괜찮아 보여요.
  • explode()의 행동이 징그럽다. - Qiita.
  • [PHP] 공백 문자 explode()는 공백으로 돌아가지 않습니다. - Qiita
  • 문자열 배열에서 빈 문자를 제거하는 보호 기술
  • 따라서'성능 개선 목적의 작업'이라면 자제해야 한다
    눈도 못 떼게. 

    좋은 웹페이지 즐겨찾기