【问题标题】:PHP: many concats or one implode?PHP:许多连接还是一个内爆?
【发布时间】:2011-05-29 00:12:23
【问题描述】:

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

【问题讨论】:

  • 如果有共同的胶水(即空格、回车),我通常会内爆
  • 那么为什么用户语言会提供创建大字符串的工具呢?为什么 C# 中有一个 StringBuilder?因为如果您正在处理大字符串,那么构建它们的方式就是一个问题。 PHP不仅可以用来生成网页!请停止燃烧。
  • 优化大字符串的最佳方法是避免大字符串。对于通过网络发送并由单个人查看的网页,所有字符串都应该很短。
  • 即使它对代码的影响很小,但我知道的还有一件事。没有无用的知识,因为任何能提高你对所用语言的理解的东西对你都有好处。请停止燃烧。

标签: php arrays performance string


【解决方案1】:

首先附注 - 在实际生产应用程序中,这些都无关紧要,因为时间差异是肤浅的,应用程序的优化应该在其他地方完成(处理网络、数据库、文件系统等) .话虽如此,出于好奇:

implode 可能是更有效的串联,但前提是您已经拥有该数组。如果不这样做,它可能会更慢,因为所有增益都会被创建数组和分配其元素所需的时间所抵消。所以保持简单:)

【讨论】:

  • 谢谢。我知道还有其他更多的导入问题,但我将不得不在我的项目中使用这种方法,所以我想我应该问问并找到最有效的方法:)
【解决方案2】:
<?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% 的情况下需要更长的时间。例如

Starting benchmark, over 10000 iterations:

Imploding...0.007 seconds
Concatenating...0.003 seconds

【讨论】:

  • 超过两百万次迭代:(内爆...1.913 秒)(连接...1.130 秒)
  • 我想看看如果你这样做会发生什么会很有趣 $list[$_] = 'a';那会更快还是更慢,因为如果你这样做 $list[] php 必须弄清楚将“a”字符串放在哪里......可惜我这里没有一台运行 php 的计算机......跨度>
  • 事实证明,即使按照上面的要求指定密钥,所以使用 $list[$_] 不会改变时间本身。
【解决方案3】:

与网络流量、数据库、文件、图形等相比,优化很少。但是,这里是来自 sitepoint 的关于该主题的参考。

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

哪个最快?

好消息是 PHP5 很快。一世 经过测试的 5.3 版,您的功能远不止于此 可能内存不足 体验性能问题。 但是,数组内爆方法 通常需要两倍的时间 标准连接运算符。一种 需要可比的时间段 连接字符串或构建 数组,但内爆函数 加倍努力。

不出所料,PHP 针对 字符串处理和点运算符 将是最快的串联 大多数情况下的方法。

【讨论】:

    【解决方案4】:

    从 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 函数比字符串连接快一倍。但是字符串连接的内存使用量非常少

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-09-12
      • 1970-01-01
      • 2010-10-05
      • 2018-12-10
      • 2013-12-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多