使用数组是否比多次语句更快?

5

我在想,这样做是否能获得更好的性能:

$value  = preg_replace( array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value);

比这个更好:
$value  = preg_replace('/_{1,}/', '_', $value);
$value  = preg_replace('/-{2,}/', '-', $value);

这只是一个非常简单的例子。


8
两个词:搞定它。 - deceze
1
$start = microtime(true); // 你的代码; echo microtime(true) - $start;。重复几次并查看结果。 - Leri
我在处理中,请稍等一下。 :) - insertusernamehere
可能是如何基准测试PHP脚本的效率的重复问题。 - Toto
5个回答

3

我的测试代码如下:

$value = 'dfkjgnnfdjgnjnfdkgn dnf gnjknkxvjn jkngjsrgn';
$value1 = 'dfkjgnnfdjgnjnfdkgn dnf gnjknkxvjn jkngjsrgn';

$start = microtime(true);
for ($i = 0; $i < 1000000; $i++)
$value  = preg_replace( array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value);
echo microtime(true) - $start.'<br>';

$start1 = microtime(true);
for ($i = 0; $i < 1000000; $i++){
    $value1  = preg_replace('/_{1,}/', '_', $value1);
    $value1  = preg_replace('/-{2,}/', '-', $value1);
}
echo microtime(true) - $start1;

1.4254899024963

1.2811040878296


2
@insertusernamehere 不用谢。顺便说一下,你帮了我很多。我优化了项目的一小部分,这使我在当前情况下获得了几乎半秒的差异,这真的非常有价值。也谢谢你。 - Leri

2

使用PLB在评论中提到的microtime()测试方法,你会看到性能差异约为0.3秒。第二个示例运行“更快”。


基于什么?我进行了测试,第二个更快。 - Fabio Mora
我编辑了我的答案,以更正测试中的逻辑错误。这是使用microtime函数来回显执行时间。第二个比第一个快约0.3秒。 - Matthew Vita

1

为了跟进呼叫,我创建了一个非常简短的示例,其中替换有一些关联:

$value  = '1_2__3___4____5_____6______1-2--3---4----5-----6------';

$s_1    = microtime(true);
    for ($i = 0; $i < 1000000; ++$i) {
        $r_1    = preg_replace( array('/_{2,}/', '/-{2,}/'), array('_', '-'), $value);
    }
$e_1    = microtime(true);

$s_2    = microtime(true);
    for ($i = 0; $i < 1000000; ++$i) {
        $r_2    = preg_replace('/_{2,}/', '_', $value);
        $r_2    = preg_replace('/-{2,}/', '-', $r_2);
    }
$e_2    = microtime(true);

print $r_1;
print $r_2;
print $e_1 - $s_1;
print $e_2 - $s_2;

根据这个结果:

3.69554805756

3.2879319191

正如预期的那样,没有显著的差异 - 实际上根本没有差异 - 因为我们谈论的是一百万个调用。另外有趣的是第二个版本“稍微”更快。我猜这是因为创建和运行那些数组。


如果你的模式比这个例子更复杂,请查看 S(study)修改器 - Fabio Mora
这听起来很有趣,特别是对于真正复杂的问题。感谢您的提示。 - insertusernamehere

0

有趣的是,我运行了这两个脚本,在我的情况下,使用数组的脚本更快。

第一次测试

2.0891699790955

2.2491400241852


第二个测试

3.2192239761353

3.4498269557953


系统

PHP: 5.4.9

操作系统: Ubuntu x64

CPU: i7-3630QM


0
挖掘一個舊的帖子。我剛在 MacOS 上運行了測試,使用 insertnamehere 的函數得到了這些結果:
// Arrays
1.8200218677521

// Individual statements
2.4083371162415

所以这本身是有趣的。然而,我想更进一步,介绍一个新的测试,因为在第一个测试中,数组在每次循环中都被创建。如果我们在循环运行之前创建它们会发生什么?

$find = array('/_{2,}/', '/-{2,}/');
$replace = array('_', '-');

$s_3    = microtime(true);
    for ($i = 0; $i < 1000000; ++$i) {
        $r_1    = preg_replace( $find, $replace, $value);
    }
$e_3    = microtime(true);

1.7364799976349  // Arrays (created)
2.4450128078461  // Individual statements
1.5605390071869  // Arrays (referenced)

每次结果都不同,但自然引用的数组速度更快。在我的环境中,单个语句要慢得多。

需要注意的是,简单地重新加载页面几次,两个数组匹配速度往往会收敛,直到几乎没有差异。这可能是PHP缓存编译脚本的原因 - 进行小的编辑并保存后,再次给出更大的差异值。

因此,在生产环境中还有另一个基准测试 - 在实时脚本中值如何随时间变化?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接