我在想,这样做是否能获得更好的性能:
$value = preg_replace( array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value);
比这个更好:
$value = preg_replace('/_{1,}/', '_', $value);
$value = preg_replace('/-{2,}/', '-', $value);
这只是一个非常简单的例子。
我在想,这样做是否能获得更好的性能:
$value = preg_replace( array('/_{1,}/', '/-{2,}/'), array('_', '-'), $value);
$value = preg_replace('/_{1,}/', '_', $value);
$value = preg_replace('/-{2,}/', '-', $value);
这只是一个非常简单的例子。
我的测试代码如下:
$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
使用PLB在评论中提到的microtime()测试方法,你会看到性能差异约为0.3秒。第二个示例运行“更快”。
为了跟进呼叫,我创建了一个非常简短的示例,其中替换有一些关联:
$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
正如预期的那样,没有显著的差异 - 实际上根本没有差异 - 因为我们谈论的是一百万个调用。另外有趣的是第二个版本“稍微”更快。我猜这是因为创建和运行那些数组。
有趣的是,我运行了这两个脚本,在我的情况下,使用数组的脚本更快。
第一次测试
2.0891699790955
2.2491400241852
第二个测试
3.2192239761353
3.4498269557953
系统
PHP: 5.4.9
操作系统: Ubuntu x64
CPU: i7-3630QM
// 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缓存编译脚本的原因 - 进行小的编辑并保存后,再次给出更大的差异值。
因此,在生产环境中还有另一个基准测试 - 在实时脚本中值如何随时间变化?