代码之家  ›  专栏  ›  技术社区  ›  Veger

更换速度优化

  •  2
  • Veger  · 技术社区  · 15 年前

    当看到被接受的答案 stripping out all characters from a string, leaving numbers ,作者添加了一个 + 在表达式之后

    $str = preg_replace('/[^0-9.]+/', '', $str);
    

    为了找到子字符串,而不是单个出现,要删除。对于功能, + 是可选的。但我开始怀疑 + 是否更快。(还是没有区别?)

    我假设它更快,因为字符串和内存处理更少。但我也可以理解,更复杂的regex表达式比简单表达式慢。

    所以,当使用此技术删除子字符串时,应该尝试查找大或小的子字符串吗?

    3 回复  |  直到 15 年前
        1
  •  1
  •   goat    15 年前

    不要过多地阅读基准测试结果。他们很难做好。实际上,您应该从中得到的唯一一点是,在某些类型的字符串上,重复的速度可能更快,因为这些字符串的重复跨度很长。

    这种类型的东西可以很容易地改变与不同版本的PCRE。

    function tst($pat, $str) {
        $start = microtime(true);
        preg_replace($pat, '', $str);
        return microtime(true) - $start;
    }
    $strs = array(
        'letters' => str_repeat("a", 20000),
        'numbers' => str_repeat("1", 20000),
        'mostly_letters' => str_repeat("aaaaaaaaaaaaa5", 20000),
        'mostly_numbers' => str_repeat("5555555555555a", 20000)
    );
    $pats = array(
        'rep' => '/[^0-9.]+/',
        'norep' => '/[^0-9.]/'
    );
    
    //precompile patterns(php caches them per script) and warm up microtime
    microtime(true);
    preg_replace($pats['rep'], '', 'foo');
    preg_replace($pats['norep'], '', 'foo');
    
    foreach ($strs as $strname => $str) {
        echo "$strname\n";
        foreach ($pats as $patname => $pat) {
            printf("%10s    %.5f\n", $patname, tst($pat, $str));
        }
    }
    
    
        2
  •  1
  •   Community rohancragg    7 年前

    我做了一些速度测试 chris 建议。与他的代码相比:

    • 为比较添加了str_替换:
    $str_replace_array = array('0', '1', '2', '3', '4', '5', '6', '7', '8', '9', '.');
    
    function tst($pat, $str) {
        global $str_replace_array;
        $start = microtime(true);
        if($pat == '')
            str_replace($str_replace_array, '', $str);
        else
            preg_replace($pat, '', $str);
        return microtime(true) - $start;
    }
    • 使所有字符串的长度相同,因此可以更好地比较结果

    结果如下:

    letters
             rep    0.00298
           norep    0.06953
     str_replace    0.00406
    
    numbers
             rep    0.02867
           norep    0.02612
     str_replace    0.01242
    
    mostly_letters
             rep    0.00931
           norep    0.06649
     str_replace    0.00593
    
    mostly_numbers
             rep    0.03285
           norep    0.02942
     str_replace    0.01359
    

    它显示了重复regex + 添加)在替换较大的块时更快(内存处理更少?)但当不需要更换太多的regex时,没有重复的regex会稍微快一点。

    此外,str_替换 基本上总是 比regex替换更快(速度的两倍),除非regex与完整字符串匹配。

        3
  •  0
  •   mck89    15 年前

    我没有做任何测试,但是使用+你匹配更多的字符,所以替换过程应该执行更少的时间。如果不在regexp中写入+符号,则将对每个字符进行替换,而不是替换整个子字符串,因此我认为速度较慢。