繁体   English   中英

PHP多行,连接字符串

[英]PHP multiline, concatenated strings

两者之间有什么区别,在速度/性能方面?

$sql = "SELECT * "
     . "FROM `myTable` "
     . "WHERE `id` = 4";



$sql = "SELECT *
        FROM `myTable`
        WHERE `id` = 4";

可能是一个非常非常小的差异,第一个可能有点慢(因为连接) ...

...但是执行单个简单SQL查询所花费的时间将是数千个(可能是数百个,只有一个简单的查询 - 只是一个疯狂的猜测,但你会看到这一点)比那个非常小的差异更重要!

所以,你真的不应该为这种“优化”而烦恼,并考虑/选择最容易写/读/理解和维护的东西。


编辑:只是为了好玩,这里是为第一部分代码生成的操作码:

$ php -dextension=vld.so -dvld.active=1 temp-2.php
Branch analysis from position: 0
Return found
filename:       /home/squale/developpement/tests/temp/temp-2.php
function name:  (null)
number of ops:  6
compiled vars:  !0 = $sql
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   5     0  EXT_STMT
         1  CONCAT                                           ~0      'SELECT+%2A+', 'FROM+%60myTable%60+'
         2  CONCAT                                           ~1      ~0, 'WHERE+%60id%60+%3D+4'
         3  ASSIGN                                                   !0, ~1
   8     4  RETURN                                                   1
         5* ZEND_HANDLE_EXCEPTION

并且,对于第二个:

$ php -dextension=vld.so -dvld.active=1 temp-2.php
Branch analysis from position: 0
Return found
filename:       /home/squale/developpement/tests/temp/temp-2.php
function name:  (null)
number of ops:  4
compiled vars:  !0 = $sql
line     #  op                           fetch          ext  return  operands
-------------------------------------------------------------------------------
   7     0  EXT_STMT
         1  ASSIGN                                                   !0, 'SELECT+%2A%0A++++++++FROM+%60myTable%60%0A++++++++WHERE+%60id%60+%3D+4'
   9     2  RETURN                                                   1
         3* ZEND_HANDLE_EXCEPTION

所以,是的,存在差异......但是,我之前所说的仍然是真的:你不应该关心那种优化:你会在其他部分做很多“未优化”的东西您的应用程序(或者即使您的服务器的配置) ,像这样的小差异意味着绝对没有


好吧,除非你是谷歌并拥有数千台服务器,我猜^^

要测试这种东西,你可以使用一个很长的循环并反复运行代码进行比较。 这样做两次(或更多)来比较操作。 运行几十次并跟踪结果。

ob_start();
$t = microtime(true);
while($i < 1000) {
    // CODE YOU WANT TO TEST

    ++$i;
}
$tmp = microtime(true) - $t;
ob_end_clean();

echo $tmp

我认为后者更快。 因为您在前者中使用了连接运算符,解析它可能需要一些时间。

我认为第一个可能因为连接而需要更长的时间,但是,它并没有太大的区别。 如果您担心优化,可以先在数据库中使用存储过程,而不是在PHP代码中编写SQL。 这不仅会提高速度,还会提高安全性。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM