在我当前的项目中,我将一个字符串组合成许多小字符串(直接输出不是一个选项)。进行许多字符串连接会更有效吗?或者我应该将部件添加到阵列并将其内爆?
答案 0 :(得分:15)
首先是附注 - 在实际的生产应用程序中任何一个都无关紧要,因为时间差异是肤浅的,应用程序的优化应该在其他地方完成(处理网络,数据库,文件系统等) 。话虽如此,出于好奇心的缘故:
implode
可能是更高效的连接,但前提是您已经拥有该数组。如果不这样做,它可能会变慢,因为所有增益都会被创建数组并分配其元素所需的时间所抵消。所以保持简单:)
答案 1 :(得分:8)
与网络流量,数据库,文件,图形等相比,优化很少。但是,这里是来自sitepoint的主题参考。
http://www.sitepoint.com/high-performance-string-concatenation-in-php/
哪个最快?
好消息是PHP5很快。一世 测试版本5.3,你会更多 可能会耗尽内存 遇到性能问题。 但是,数组内爆方法 通常需要两倍的时间 标准连接运算符。一个 需要相当的时间段 连接字符串或构建 数组,但内爆函数 加倍努力。
不出所料,PHP已经过优化 字符串处理和点运算符 将是最快的连接 大多数情况下的方法。
答案 2 :(得分:8)
<?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%的时间。 e.g。
Starting benchmark, over 10000 iterations:
Imploding...0.007 seconds
Concatenating...0.003 seconds
答案 3 :(得分:0)
从 php 7.4.3 开始
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
内爆函数比字符串连接快两倍。但是字符串连接的内存使用量非常少