PHP:使用多个字符串连接还是一个implode函数?

14

在我的当前项目中,我需要将一个字符串组合成许多小字符串(直接输出不是一个选项)。做许多字符串拼接是否更有效?或者应该将这些部分添加到数组中并使用implode函数?


1
通常情况下,如果有一个共同的粘合剂(例如空格、回车),我会将其压缩。 - John Giotta
那么为什么用户语言提供创建大字符串的工具呢?为什么C#中有一个StringBuilder?因为如果你正在处理大字符串,构建它们的方式确实是一个问题。PHP不仅可以用于生成网页!请停止争吵。 - Oliver A.
优化大字符串的最佳方法是避免使用大字符串。对于通过网络发送并由单个人查看的网页,所有字符串都应该很短。 - Your Common Sense
4
即使它对代码影响不大,这也是我所知道的另一件事情。没有无用的知识,因为任何能提高你对所使用编程语言理解的东西都对你有好处。请停止恶意攻击。 - Oliver A.
4个回答

17

首先需要注意的是,这些在真实生产应用中都不重要,因为时间差异表面而已,应该在其他地方进行应用程序优化(处理网络、数据库、文件系统等)。话虽如此,出于好奇心:

implode 可能更有效率一些,但前提是你已经有了数组。如果没有的话,由于需要创建数组和分配其元素的时间,所有收益都会被抵消,所以保持简单 :)


谢谢。我知道还有其他更重要的问题,但我将不得不在我的整个项目中使用这种方法,所以我想问一下并找到最有效的方法 :) - Oliver A.

10
<?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

超过两百万次迭代:(压缩...1.913秒)(连接...1.130秒) - Julian
我认为如果你执行$list[$_] = 'a';会很有趣。这样做会更快还是更慢呢?因为如果你执行$list[],PHP必须找出在哪里放置'a'字符串...可惜我这里没有运行PHP的计算机... - bkwint
事实证明,即使按照上面所要求的指定键,使用 $list[$_] 对时间本身也没有任何影响。 - ZioCain

8

相较于网络流量、数据库、文件、图形等,优化字符串连接对性能的提升微乎其微。然而,以下是sitepoint上有关该主题的参考资料。

http://www.sitepoint.com/high-performance-string-concatenation-in-php/

哪种方法最快?

好消息是PHP5速度很快。我测试了版本5.3,你更可能因为内存不足而非性能问题而出现错误。然而,数组implode方法通常需要的时间是标准连接运算符的两倍。连接字符串或构建数组所需的时间差不多,但implode函数会使工作量加倍。

毫不奇怪,PHP针对字符串处理进行了优化,点运算符在大多数情况下将是最快的连接方法。


1
截至 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

implode函数的速度比字符串拼接快两倍,但字符串拼接的内存使用量非常小。


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