在我的当前项目中,我需要将一个字符串组合成许多小字符串(直接输出不是一个选项)。做许多字符串拼接是否更有效?或者应该将这些部分添加到数组中并使用implode函数?
在我的当前项目中,我需要将一个字符串组合成许多小字符串(直接输出不是一个选项)。做许多字符串拼接是否更有效?或者应该将这些部分添加到数组中并使用implode函数?
首先需要注意的是,这些在真实生产应用中都不重要,因为时间差异表面而已,应该在其他地方进行应用程序优化(处理网络、数据库、文件系统等)。话虽如此,出于好奇心:
implode
可能更有效率一些,但前提是你已经有了数组。如果没有的话,由于需要创建数组和分配其元素的时间,所有收益都会被抵消,所以保持简单 :)
<?php
function microtime_float()
{
list($usec, $sec) = explode(" ", microtime());
return ((float)$usec + (float)$sec);
}
define('ITERATIONS', 10000);
header('Content-Type: text/plain');
printf("Starting benchmark, over %d iterations:\r\n\r\n", ITERATIONS);
print("Imploding...");
$start = microtime_float();
$list = Array();
for ($_ = 0; $_ < ITERATIONS; $_++)
$list[] = 'a';
$result = implode('',$list);
$end = microtime_float() - $start;
printf("%0.3f seconds\r\n", $end);
unset($list,$result);
print("Concatenating...");
$start = microtime_float();
$result = '';
for ($_ = 0; $_ < ITERATIONS; $_++)
$result .= 'a';
$end = microtime_float() - $start;
printf("%0.3f seconds\r\n", $end);
?>
结果是 99% 的情况下 implode 函数的执行时间更长。例如:
Starting benchmark, over 10000 iterations:
Imploding...0.007 seconds
Concatenating...0.003 seconds
相较于网络流量、数据库、文件、图形等,优化字符串连接对性能的提升微乎其微。然而,以下是sitepoint上有关该主题的参考资料。
http://www.sitepoint.com/high-performance-string-concatenation-in-php/
哪种方法最快?
好消息是PHP5速度很快。我测试了版本5.3,你更可能因为内存不足而非性能问题而出现错误。然而,数组implode方法通常需要的时间是标准连接运算符的两倍。连接字符串或构建数组所需的时间差不多,但implode函数会使工作量加倍。
毫不奇怪,PHP针对字符串处理进行了优化,点运算符在大多数情况下将是最快的连接方法。
Script1.php
$startMemory = memory_get_usage();
$t = microtime(true);
$array = '';
for ($i = 0; $i < 500000; $i++) {
$array .=$i . ',';
}
echo $array . '<br>';
$time = (microtime(true) - $t) . ' Seconds<br>';
$memory = (memory_get_usage() - $startMemory) / 1024 / 1024 . ' MB <br>';
echo $time . $memory;
// 0.11040306091309 Seconds
// 7.9923934936523 MB
Script2.php
$startMemory = memory_get_usage();
$t = microtime(true);
$array = array();
for ($i = 0; $i < 500000; $i++) {
array_push($array, $i);
}
echo implode(",", $array) . '<br>';
$time = (microtime(true) - $t) . ' Seconds<br>';
$memory = (memory_get_usage() - $startMemory) / 1024 / 1024 . ' MB <br>';
echo $time . $memory;
// 0.32534003257751 Seconds
// 21.992469787598 MB
Script3.php
$startMemory = memory_get_usage();
$t = microtime(true);
$array = array();
for ($i = 0; $i < 500000; $i++) {
$array[] = $i;
}
echo implode(",", $array) . '<br>';
$time = (microtime(true) - $t) . ' Seconds<br>';
$memory = (memory_get_usage() - $startMemory) / 1024 / 1024 . ' MB <br>';
echo $time . $memory;
// 0.087002038955688 Seconds
// 21.992446899414 MB
implode函数的速度比字符串拼接快两倍,但字符串拼接的内存使用量非常小。