PHP:许多concats还是一个内爆?

时间:2010-12-21 18:32:08

标签: php arrays performance string

在我当前的项目中,我将一个字符串组合成许多小字符串(直接输出不是一个选项)。进行许多字符串连接会更有效吗?或者我应该将部件添加到阵列并将其内爆?

4 个答案:

答案 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

内爆函数比字符串连接快两倍。但是字符串连接的内存使用量非常少