PHP中的字符串拼接非常简单直接, 最常用的方式是点 $a . $b
,
当拼接复杂的字符串时, 常用 sprintf('%s%s', $a, $b)
函数, 他们两个效率如何, 做了如下实验
测试代码
$str = "I am a str";
$num = 12;
$float = 13.1;
$byte_arr = ['a', 'b', 'c', 'd', 'e', 'f', 'g', 'h', 'i', 'j'];
// 计算微秒时间
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
$start = microtime_float();
// 命令行输入normal时, 执行用点拼接
if ($argv[1] == 'normal') {
for ($i = 0; $i < 10000000; $i++) {
$tmp = $str . ($num + $i) . ($float + $i) . ($byte_arr[$i % 10]);
}
}
// 命令行输入sprintf时, 用此函数拼接
if ($argv[1] == 'sprintf') {
for ($i = 0; $i < 10000000; $i++) {
$tmp = sprintf("%s%s%s%s", $str, ($num + $i), ($float + $i), $byte_arr[$i % 10]);
}
}
echo "time use: " . (microtime_float() - $start) . PHP_EOL;
上述测试用例, 分别拼接浮点数, 整数, 字符串, 字符这几个类型.
拼接次数为 1 千万次, 所拼接的数据是一样的, 唯一的变量就是拼接方式不同.
执行效果如下:
$ php test.php normal
time use: 2.8138599395752
$ php test.php normal
time use: 2.7641689777374
$ php test.php normal
time use: 2.7950520515442
$ php test.php normal
time use: 2.8259289264679
$ php test.php normal
time use: 2.8023228645325
$ php test.php sprintf
time use: 2.9651329517365
$ php test.php sprintf
time use: 2.9609770774841
$ php test.php sprintf
time use: 2.995875120163
$ php test.php sprintf
time use: 3.0061948299408
$ php test.php sprintf
time use: 2.933119058609
结果显然是直接用点拼接效率更高. 但是要注意, 这是在单次拼接1千万次的时候才出现性能的差异, 如果不是频繁的字符串拼接, 比如日常的格式化输出日志, 还是按照习惯使用即可.
另外, 附上我的测试环境
$ php --version
PHP 7.3.29 (cli) (built: Jul 13 2021 02:33:51) ( NTS )
Copyright (c) 1997-2018 The PHP Group
Zend Engine v3.3.29, Copyright (c) 1998-2018 Zend Technologies
CPU: Intel(R) Xeon(R) CPU E5-1620 v4 @ 3.50GHz
OS: Ubuntu 18.04.5 LTS