PHP многострочные, связанные строки - PullRequest
2 голосов
/ 06 августа 2009

Есть ли разница между двумя показателями скорости / производительности?

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



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

Ответы [ 4 ]

6 голосов
/ 06 августа 2009

Может быть, очень очень очень маленькая разница, первая, вероятно, немного медленнее (из-за конкатенации) ...

... Но время, необходимое для выполнения вашего простого 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

Так что, да, есть разница ... Но, тем не менее, то, что я сказал ранее, все еще верно: вам не нужно заботиться об этом виде оптимизации: вы будете делать так много "неоптимизированных" вещей в другие части вашего приложения (или даже если конфигурация вашего сервера) , что такая небольшая разница, как эта, абсолютно ничего не значит


Ну, разве что, если вы гуглили и у вас тысячи серверов, я думаю ^^

2 голосов
/ 06 августа 2009

Для тестирования такого рода вещей вы используете большой цикл while и запускаете код снова и снова для сравнения. Сделайте это дважды (или больше), чтобы сравнить операции. Запустите его несколько десятков раз и отследите результаты.

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

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

echo $tmp
0 голосов
/ 06 августа 2009

Я думаю, что первый может занять немного больше времени из-за конкатенации, но это не будет большой разницей. Если вы беспокоитесь об оптимизации, вы можете начать с использования хранимых процедур в вашей базе данных вместо написания SQL-кода в вашем php-коде. Это повысит не только скорость, но и безопасность.

0 голосов
/ 06 августа 2009

Я думаю, что последний быстрее. потому что вы использовали оператор конкатенации в первом из них, анализ которого может занять некоторое время.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...