天道酬勤,学无止境

复制 php 变量的性能影响(Performance impact of copying php variables)

问题

只是想知道复制非常大的 php 变量对性能的影响。 例如说 $arr 是一个巨大的数组。 如果我做 $arr2 = $arr,这是一个深拷贝还是 $arr2 只是一个指向 $arr 的指针,就像在 Java 中一样? 提前致谢。

回答1

$arr2 = $arr创建一个深拷贝。 但实际的复制只有在修改 $arr2 时才会发生——PHP 使用写时复制。

如果您想要一个“指针”而不是副本,请使用$arr2 =& $arr ,这会使 $arr2 成为对 $arr 的引用。

回答2

如果你使用 $arr2 = &$arr ;

它将引用 $arr 。

回答3

PHP 中的一般规则是不要创建引用,除非您需要它们提供的功能。 否则,引用只会使代码变慢。

http://www.php.net/manual/en/language.references.php

标签

受限制的 HTML

  • 允许的HTML标签:<a href hreflang> <em> <strong> <cite> <blockquote cite> <code> <ul type> <ol start type> <li> <dl> <dt> <dd> <h2 id> <h3 id> <h4 id> <h5 id> <h6 id>
  • 自动断行和分段。
  • 网页和电子邮件地址自动转换为链接。

相关推荐
  • 在 MATLAB 中使用全局变量会影响性能吗?(Does using global variables impact performance in MATLAB?)
    问题 据我了解,MATLAB 在向其他函数发送参数时不能使用pass by reference 。 我正在做音频处理,我经常需要将波形作为参数传递给函数,并且因为 MATLAB 对这些参数使用pass by value ,所以当我这样做时它真的会占用大量 RAM。 我正在考虑使用global变量作为将波形传递给函数的方法,但是我读到的任何地方似乎都普遍认为这是一个坏主意,对于代码组织和潜在的性能问题......但我没有没有真正阅读有关这可能如何影响性能的任何详细答案...... 我的问题:在1)性能和2)通用代码组织和良好实践方面,使用全局变量(大小 > 100MB)将参数传递给 MATLAB 中的其他函数有什么负面影响。 编辑:从下面@Justin 的回答来看,当您不修改函数中的参数时,MATLAB 有时会使用按引用传递! 由此,我有关于全局变量性能的第二个相关问题: 使用全局变量会比使用pass by reference函数的参数慢吗? 回答1 MATLAB确实使用按引用传递,但也使用写时复制。 也就是说,您的变量将通过引用传递到函数中(因此不会在 RAM 上加倍),但是如果您更改函数内的变量,则 MATLAB 将创建一个副本并更改副本(离开原版不受影响)。 这个事实似乎不太为人所知,但 Loren 的博客上有一篇很好的文章讨论了它。 底线:听起来您根本不需要使用全局变量(正如
  • PHP Composer xdebug 警告(PHP composer xdebug warning)
    问题 PHP 新手。 在 PHP 项目上工作并启用 xdebug 以便能够调试我的 php 应用程序。 生产服务器没有启用 xdebug,因为它由另一个团队处理。 在我的本地机器上,当我运行 composer 它会给我一个警告说 You are running composer with xdebug enabled. This has a major impact on runtime performance. 我不想在开发时禁用 xdebug。 只是想确认在开发环境中运行 xdebug 应该不会影响Composer 在生产服务器上安装应用程序的库/性能。 回答1 我不想在开发时禁用 xdebug。 只是想确认在开发环境中运行 xdebug 应该不会影响Composer 在生产服务器上安装应用程序的库/性能。 仅仅加载 Xdebug 就会产生巨大的影响。 即使未启用分析功能,它也会使 Composer 运行速度降低 3 倍或 4 倍。 换句话说:xdebug 对于调试是无价的,但会增加 Composer 的内存使用和处理时间。 如何为 Composer 运行禁用 Xdebug? 我的建议是编写一个小的调用助手来运行 Composer。 帮助程序是一个使用自定义php.ini调用 PHP 的 bash 或批处理脚本,特别是为 Composer 配置的。 让我们称之为: php
  • PHP 性能:复制与参考(PHP Performance : Copy vs. Reference)
    问题 嘿。 今天我写了一个小的基准脚本来比较复制变量和创建对它们的引用的性能。 我期待,例如创建对大数组的引用会比复制整个数组慢得多。 这是我的基准代码: <?php $array = array(); for($i=0; $i<100000; $i++) { $array[] = mt_rand(); } function recursiveCopy($array, $count) { if($count === 1000) return; $foo = $array; recursiveCopy($array, $count+1); } function recursiveReference($array, $count) { if($count === 1000) return; $foo = &$array; recursiveReference($array, $count+1); } $time = microtime(1); recursiveCopy($array, 0); $copyTime = (microtime(1) - $time); echo "Took " . $copyTime . "s \n"; $time = microtime(1); recursiveReference($array, 0); $referenceTime =
  • 变量名称长度对 PHP 的性能有影响吗?(Does variable name length matter for performance in PHP?)
    问题 我已经看到这个变量名称长度对性能 C# 有影响吗? 主题并有关于 php 的相同问题。 我的同事(前端)已经编码了 $o、$r、$x、$m、$c 之类的所有内容,并激发了它的最佳性能。 我真的很怀疑它,代码变得难以阅读。 $o - 对象或对象 $m - $model $r - $query_result 或 $result $x - $xml_node 每件事看起来都像 if ( isset ( self::$o[ self::$x -> name ] ) ) : $c = 'ClassPrefix_' . self::$o[ self::$x -> name ]; $o = new $c; self::$x -> read ( ); 回答1 变量名更多地是作为程序员的助手——当程序或脚本被解释时,它们被转换成内存位置。 在将来修改/调试代码时,较短的变量只会对程序员的性能产生负面影响。 混淆是一种广泛使用的技术,它涉及用单/多字符变量名替换变量名,但它用于尝试使逆向工程/从源代码容易获得/易于提取的项目中提升核心技术更加困难。 回答2 虽然它可能会在此处节省一个字节,在那里节省一个字节,但不,一个 iota 无关紧要,并且您不会看到通过使用短变量名来节省实际内存或性能。 如果您真的担心内存使用和性能,请分析您的代码。 xdebug 和 xhprof 是完成它的好工具。
  • `get_defined_vars()` 的性能影响是什么?(What is the performance impact off `get_defined_vars()`?)
    问题 我经常看到关于 SO 的问题,其答案/解决方案包括使用get_defined_vars()或互联网上使用该方法的博客文章。 在大多数情况下,它用于调试目的,但在某些情况下,作者似乎有意在生产代码中使用它。 虽然我很少使用这个函数,因为它让我感觉很不舒服,但我想知道在 PHP 应用程序中使用这个函数的实际性能影响是什么。 其用法的一个示例可能是查看变量是否显式设置为NULL : //$implicit_null = 1234; $explicit_null = NULL; var_dump(is_null($implicit_null)); // TRUE, also throws undefined index error var_dump(( array_key_exists('implicit_null',get_defined_vars()) && is_null($implicit_null) )); // FALSE 互联网上还有其他用例,但很少概述性能或内存影响可能是什么。 回答1 事实证明,内存影响可能会有所不同,但在最坏的情况下,它几乎可以使您的内存使用量翻倍。 function report_memory($string = '') { $mem = (memory_get_usage()/1000); echo "$string: {$mem}kb\n"
  • 使用 null 初始化局部变量会影响性能吗?(Does initialization of local variable with null impacts performance?)
    问题 让我们比较两段代码: String str = null; //Possibly do something... str = "Test"; Console.WriteLine(str); 和 String str; //Possibly do something... str = "Test"; Console.WriteLine(str); 我一直认为这些代码段是平等的。 但是在我构建了这些代码(已检查优化的发布模式)并比较了生成的 IL 方法后,我注意到第一个示例中还有两个 IL 指令: 第一个示例代码 IL: .maxstack 1 .locals init ([0] 字符串 str) IL_0000: ldnull IL_0001:stloc.0 IL_0002:ldstr“测试” IL_0007:stloc.0 IL_0008: ldloc.0 IL_0009: 调用 void [mscorlib] System.Console::WriteLine (string) IL_000e:返回 第二个示例代码 IL: .maxstack 1 .locals init ([0] 字符串 str) IL_0000:ldstr“测试” IL_0005:stloc.0 IL_0006: ldloc.0 IL_0007: 调用 void [mscorlib]System
  • 复制或不复制PHP中的其他变量?(Copy or don't copy extra variables in PHP?)
    问题 阅读Google Developers PHP性能提示后,我发现不建议额外复制一个变量。 代替这个: $description = strip_tags($_POST['description']); echo $description; 它建议这样做: echo strip_tags($_POST['description']); 原因是可能不必要的内存消耗。 但是在进行一些搜索时,我看到一些反驳,说PHP实现了“写时复制”内存管理。 这基本上意味着我们可以为任意多个变量分配一个值,而不必担心实际复制的数据。 因此,我想知道是否在更复杂的情况下,例如在代码的许多地方使用$_POST或$_GET变量,考虑这些条件,使用还是不使用额外的变量是更好的做法: 1)安全性 2)维护/可读性 3)表现 编辑1 我将使用以下示例更好地说明问题。 这种代码是否更好(考虑以上条件): $user = anti_injection($_POST['user']); $pass = anti_injection($_POST['pass']); // Continue the code using $user and $pass 或这个? $_POST['user'] = anti_injection($_POST['user']); $_POST['pass'] = anti
  • PHP - 全局变量的性能和内存问题(PHP - performance and memory issue with global variables)
    问题 假设情况:我在 php 中运行一个复杂的站点,并且我使用了很多全局变量。 我可以将变量存储在现有的全局范围内,比如$_REQUEST['userInfo'] 、 $_REQUEST['foo']和$_REQUEST['bar']等,并将很多不同的东西放入请求范围(这将是适当的使用,因为这些数据指的是请求本身)。 或者 我可以继续使用像global $userInfo, $foo, $bar; 在我的大部分功能中。 两种解决方案是否存在性能下降或内存使用差异? 一个更容易打字...所以有最佳实践指南吗? 回答1 您的全局变量已经可以在$GLOBALS['foo'], $GLOBALS['bar']等中访问。这在函数作用域内更清楚地表明它们来自全局作用域,而不是使用global关键字。 不应以任何有意义的方式影响性能。 许多人会告诉你,最佳实践是首先避免全局变量,而是通过函数调用和对象构造函数传递变量。 回答2 两者都非常糟糕。 我建议使用单例或静态类。 至于内存使用,不会有明显差异。
  • 带有指针的辅助变量是否有任何性能/内存影响?(Does an auxiliary variable with a pointer have any performance/memory impact?)
    问题 可以? 我一般会选这个 NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear]; [self setMonths: monthsForChosenYear]; 对此, [self setMonths: [self monthsForYear:newChosenYear]]; 主要是因为它乍一看很容易理解。 哪里有第二种方法,没那么多。 但这究竟意味着什么? monthsForChosenYear 只是一个指针,但它必须以某种方式存储。 我不是问影响是否小到我不需要担心。 但我对此非常好奇。 即使重定向到一些更详细解释的文档也会很好。 先感谢您! 努诺 回答1 一个很长的答案,希望能缓解你的好奇心,有好奇心是好的! 性能和内存影响为零或微乎其微。 您想知道指针是如何存储的。 当你输入: NSArray * monthsForChosenYear; 您要求在本地存储中分配一个名为monthsForChosenYear的框(变量)。 当封闭方法退出时,此框将自动回收,如果编译器发现不再需要它,则可能早于此。 这个盒子可以保存一个NSArray *类型的值。 当你输入: NSArray * monthsForChosenYear = [self monthsForYear:newChosenYear]
  • 请问数量标签会影响性能吗? [关闭](Does the quantity of <?php and ?> tags affect performance? [closed])
    问题 关门了。 这个问题是基于意见的。 它当前不接受答案。 想要改善这个问题吗? 更新问题,以便可以通过编辑此帖子以事实和引用的形式回答。 7年前关闭。 改善这个问题 在我的php文件中,我想知道开始和结束标记是否会对性能产生影响。 IE。 <?php echo 'Hello world'; ?> <?php echo 'Hello world'; ?> <?php echo 'Hello world'; ?> <?php echo 'Hello world'; ?> <?php echo 'Hello world'; ?> 与 <?php echo 'Hello world'; echo 'Hello world'; echo 'Hello world'; echo 'Hello world'; echo 'Hello world'; ?> 如果是这样,会产生什么影响? 回答1 它对性能有影响吗? 是的。 仅仅是因为解析器还有更多文本要解析。 它必须产生影响。 是的,它将产生可衡量的影响。 它会产生有意义的影响吗? 一点都不。 即使您的应用程序中有数百万种差异,也很难看到任何差异。 是的,将会使用更多的时钟周期,但是琐碎的... 更大的事情是要注意,这两段代码通常并不完全相同。 PHP将后的闭合条带的单个新行?> ,但任何其他字符后?>将在输出呈现。 因此,
  • 在性能上哪个更好:带变量的双引号字符串或带连接的单引号字符串?(Which is better on performance: double quoted strings with variables or single quoted strings with concatenations?)
    问题 我知道在PHP中对字符串使用单引号比使用双引号要快,因为PHP不需要检查单引号字符串中是否存在变量。 我的问题是哪个会表现更好: A)带有变量的双引号字符串: echo "foo bar $baz"; 或者 B)用连接变量单引号引起来: echo 'foo bar ' . $baz; 回答1 我在不久前工作的博客上做了一个基准测试。 但是,随着我逐渐意识到,有很多变量。 其中主要的是: 您正在执行几个串联? 每次执行串联操作时,PHP都会重新解析整个字符串(或者有人告诉我)。 因此,1个串联可能更快,但是6个可能要慢得多。 数据类型。 尽管我自己还没有亲自测试过,但有人告诉我连接的数据类型也很重要,尽管我不确定有多少。 总的说来,让您真正担心它并不是一件大事。 一般来说,只有在编写大型网站(例如MySpace,Facebook,Flickr等)的情况下,它才会产生明显的变化,并且通常到那时,您背后的硬件已经太多了,单引号和双引号不再相关。 个人而言,我会说有,将在一个更实质性的方式(高速缓存,SQL优化,自动加载,以防止不必要的包括等)影响性能更为重要的事情。 我几乎每次都亲自选择单引号,但不是为了提高速度。 我这样做是因为我认为它更具可读性。 这对我来说很重要。 回答2 老实说,我认为您在寻求节省性能时不需要仔细检查这一特殊约定。 但是,就其价值而言,我想我记得读过
  • PHP对象分配与克隆(PHP Object Assignment vs Cloning)
    问题 我知道这在php文档中有所介绍,但我对此问题感到困惑。 从php docs: $instance = new SimpleClass(); $assigned = $instance; $reference =& $instance; $instance->var = '$assigned will have this value'; $instance = null; // $instance and $reference become null var_dump($instance); var_dump($reference); var_dump($assigned); ?> 上面的示例将输出: NULL NULL object(SimpleClass)#1 (1) { ["var"]=> string(30) "$assigned will have this value" } 好的,所以我看到$assigned在原始对象( $instance )被赋值为null $instance幸存下来,因此显然$assigned不是引用,而是$ instance的副本。 那么之间有什么区别 $assigned = $instance 和 $assigned = clone $instance 回答1 对象是内存中的抽象数据。 变量始终在内存中保留对此数据的引用。 试想一下,
  • 不关闭推进连接的性能影响(Performance impact of not closing propel connection)
    问题 我正在为一个项目使用 symfony 1.4/propel 1.4,该项目由其他开发人员早些时候制作。 在该项目中,使用以下代码进行推进连接 $con = Propel::getConnection(UsersPeer::DATABASE_NAME, Propel::CONNECTION_WRITE); 但是它永远不会关闭连接使用 Propel::close(); 我刚刚搜索了 1500 多起这样的打开连接事件,我想它们都没有关闭连接。 我知道关闭连接总是很好的做法,但在目前的情况下,似乎我无法解决所有问题,因为解决所有事件肯定会花费很多时间,可能需要一整天。 所以现在我很困惑我是否应该解决这个问题。 如果我让它这样,它会影响性能吗? 编辑:仅供参考 这个问题的第 2 部分 Use of closed database connection in php 回答1 如果有的话,明确关闭连接可能会损害性能。 PDO 经常缓存从一个请求到下一个请求的连接,假设下一个请求将使用相同的凭据。 编辑:阅读文档,在我看来 PDO::ATTR_PERSISTENT 连接被缓存,无论任何尝试关闭它们,所以你最好不要打扰。
  • php数组通过复制值还是通过引用分配? [复制](php array assign by copying value or by reference? [duplicate])
    问题 这个问题在这里已经有了答案: 9年前关闭。 可能的重复: php中的数组是按值传递还是按引用传递? 我听说 PHP 可以选择如何分配数组,取决于数组大小。 它可以通过复制值(作为任何标量类型)或通过引用来分配。 PHP 总是通过复制一个值来将数组分配给变量,如手册中所述。 或者它可以通过引用分配。 ? <?php $a = array(1,2,3); ?> 回答1 将数组变量分配给其他变量时,可以通过引用分配数组: // By value... $a = array(1,2,3); $b = $a; array_push($a, 5); print_r($b); // $b is not a reference to $a Array ( [0] => 1 [1] => 2 [2] => 3 ) // By Reference $a = array(1,2,3); $b = &$a; // Here we assign by reference array_push($a, 5); print_r($b); // $b is a reference to $a and gets the new value (3 => 5) Array ( [0] => 1 [1] => 2 [2] => 3 [3] => 5 ) 回答2 除非您正在引用已经存在的内容
  • PhpMyAdmin 数据导入性能问题(PhpMyAdmin data import performance issues)
    问题 最初,我的问题与 PhpMyAdmin 的 SQL 部分工作不正常有关。 正如评论中所建议的,我意识到这是无法处理的输入量。 但是,这并没有为我提供如何处理具有(在我的情况下 - 35,000 条记录行)格式为 (CSV) 的文件的有效解决方案: ... 20120509,126,1590.6,0 20120509,127,1590.7,1 20120509,129,1590.7,6 ... 就像 SQL 部分中的基本复制粘贴输入一样,PhpMyadmin 中的导入选项正在挣扎。 这次和之前一样,需要 5 分钟,直到调用 max execution time 然后停止。 有趣的是,它向表中添加了 6-7 千条记录。 所以这意味着输入实际上通过并且几乎成功地做到了。 我还尝试将文件中的数据量减半。 然而,一切都没有改变。 现在显然有问题。 当简单的数据导入不起作用时,不得不在 php 脚本中处理数据是很烦人的。 回答1 更改您的 php 上传最大大小。 你知道你的 php.ini 文件在哪里吗? 首先,尝试将此文件放入您的 Web 根目录: phpinfo.php (见 http://php.net/manual/en/function.phpinfo.php ) 包含: <?php phpinfo(); ?> 然后导航到 http://www.yoursite.com
  • 在 PHP 中包含太多文件会降低性能吗? [复制](Does including too many files in PHP reduce performance? [duplicate])
    问题 这个问题在这里已经有了答案: 9年前关闭。 可能的重复: 包含函数文件的效率(在 PHP 中) 在 php 中使用过多的 include() 如果是这样,建议最多包含多少文件? 回答1 包含文件将执行以下操作: 从磁盘读取文件。 运行文件中的代码。 这两个操作都需要时间。 时间不多,但即便如此,如果您有很多包含,它也会加起来,所以对您的问题的基本答案是“是的,它会影响性能”。 然而,这种性能损失的规模非常小,远远超过编写高质量结构良好的代码(包括在单独的文件中保留单独的类/功能)的优势。 说实话,如果您担心这类事情的性能,请尝试通过分析器(例如 xDebug)运行您的代码。 这将准确显示代码的哪些部分占用了最多的时间。 include()语句将出现在那里,但不太可能出现在列表顶部附近。 除非您正在编写一个像 Facebook 一样具有访问者编号的网站,否则您不太可能需要担心include()的性能。 但是看看 xDebug 的分析器输出,因为您的代码中可能还有其他东西比您预期的要慢得多,或者经常被调用,或者循环太多次等等,并修复这些将对代码的性能产生重大影响。 回答2 include指令确实将包含文件的内容“粘贴”在它所在的位置。 所以包含的代码加起来就是实际的脚本。 这是一个很好的解释 PHP include(): File size & performance -
  • C++:BIG 类的性能影响(有很多代码)(C++: Performance impact of BIG classes (with a lot of code))
    问题 我想知道在 C++ 中编写“全能”类是否以及如何实际影响性能。 例如,如果我有一个类Point ,只有uint x; 单位 y; 作为数据,并且已经将数学可以做的几乎所有事情都定义为方法。 其中一些方法可能是巨大的。 (copy-) 构造函数只是初始化两个数据成员。 class Point { int mx; int my; Point(int x, int y):mx(x),my(y){}; Point(const Point& other):mx(other.x),my(other.y){}; // .... HUGE number of methods.... }; 现在。 我加载一个大图像并为每个像素创建一个Point ,将它们填充到一个向量中并使用它们。 (比如说,所有方法都被调用一次)这只是一个愚蠢的例子! 它会比没有方法但有很多实用功能的同一个类慢吗? 我不是在以任何方式谈论虚函数! 我的动机:我经常发现自己编写了漂亮且相对强大的类,但是当我必须像上面的示例中那样初始化/使用大量类时,我会感到紧张。 我想我不应该。 我想我知道的是: 方法在内存中只存在一次。 (优化除外) 仅对数据成员进行分配,并且它们是唯一被复制的东西。 所以应该没有关系。 我错过了什么吗? 回答1 你是对的,方法在内存中只存在一次,它们就像普通函数一样,额外隐藏了这个参数。 当然
  • PHP: Copy On Write 和 Assign By Reference 在 PHP5 和 PHP7 上表现不同(PHP: Copy On Write and Assign By Reference perform different on PHP5 and PHP7)
    问题 我们有一段简单的代码: 1 <?php 2 $i = 2; 3 $j = &$i; 4 echo (++$i) + (++$i); 在 PHP5 上,它输出 8,因为: $i是一个引用,当我们将$i增加++i ,它将更改zval而不是复制,因此第 4 行将是4 + 4 = 8 。 这是按引用分配。 如果我们注释第 3 行,它将输出 7,每次我们通过增加它来更改值时,PHP 都会复制,第 4 行将是3 + 4 = 7 。 这是写时复制。 但是在PHP7中,它总是输出7。 我检查了 PHP7 中的更改:http://php.net/manual/en/migration70.incompatible.php,但我没有得到任何线索。 任何帮助都会很棒,提前致谢。 更新1 这是 PHP5 / PHP7 上的代码结果:https://3v4l.org/USTHR 更新2 操作码: [huqiu@101 tmp]$ php -d vld.active=1 -d vld.execute=0 -f incr-ref-add.php Finding entry points Branch analysis from position: 0 Jump found. Position 1 = -2 filename: /home/huqiu/tmp/incr-ref-add.php
  • Performance impact of copying php variables
    Just wondering about the performance impact of copying very large php variables. For example say $arr is an enormous array. If I do $arr2 = $arr, is this a deep copy or is $arr2 merely a pointer to $arr like it is in Java? Thanks in advance.
  • PHP“ foreach”实际上如何工作?(How does PHP 'foreach' actually work?)
    问题 首先,我要说一下我知道foreach是什么,做什么以及如何使用它。 这个问题关系到它如何在引擎盖下工作,我不希望“这就是使用foreach循环数组的方式”的答案。 很长时间以来,我一直认为foreach与数组本身一起工作。 然后,我发现了很多关于它可以与数组副本一起使用的事实的引用,从那时起,我一直以为这是故事的结尾。 但是我最近对此事进行了讨论,经过一番实验后发现这实际上并非100%正确。 让我表明我的意思。 对于以下测试用例,我们将使用以下数组: $array = array(1, 2, 3, 4, 5); 测试用例1: foreach ($array as $item) { echo "$item\n"; $array[] = $item; } print_r($array); /* Output in loop: 1 2 3 4 5 $array after loop: 1 2 3 4 5 1 2 3 4 5 */ 这清楚地表明,我们不是直接使用源数组-否则循环将永远持续下去,因为我们在循环过程中不断将项目推入数组。 但是只是为了确保是这种情况: 测试案例2: foreach ($array as $key => $item) { $array[$key + 1] = $item + 2; echo "$item\n"; } print_r($array); /*