Что быстрее между (строкой) $ value и "$ value" при приведении к строке - PullRequest
0 голосов
/ 12 февраля 2019

В PHP предполагается, что $value = 12345; (целое число), что быстрее при преобразовании $value из целого числа в строку;

$value = (string)$value;

или

$value = "$value";

Thisэто своего рода вопрос оценки эффективности и специально для этого случая.Спасибо за вашу помощь!

Ответы [ 2 ]

0 голосов
/ 12 февраля 2019

Ваш вопрос действительно об эффективности интерпретатора php и о том, как он преобразует php code (тот, который вы пишете) в php bytecode (тот, который работает и может фактически потреблять время и ресурсы).Если я возьму эксперимент p01ymath и разложу его:

implicit.php

<?php
$str = 12345;
for($i=0;$i<=200000000;$i++){
    $str2 = "$str";
}

implicit.php bytecode

DarkMax:temp yvesleborg$ php -dvld.active=1 -dvld.verbosity=0 -dvld.exececute=0 implicit.php 
filename:       /Users/yvesleborg/temp/implicit.php
function name:  (null)
number of ops:  14
compiled vars:  !0 = $str, !1 = $i, !2 = $str2
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
 2     0    E >   EXT_STMT                                                 
       1          ASSIGN                                                   !0, 12345
 3     2          EXT_STMT                                                 
       3          ASSIGN                                                   !1, 0
       4        > JMP                                                      ->10
 4     5      >   EXT_STMT                                                 
       6          CAST                                          6  ~5      !0
       7          ASSIGN                                                   !2, ~5
 3     8          POST_INC                                         ~7      !1
       9          FREE                                                     ~7
      10      >   IS_SMALLER_OR_EQUAL                              ~8      !1, 200000000
      11          EXT_STMT                                                 
      12        > JMPNZ                                                    ~8, ->5
 7    13      > > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     4; out0:  10
branch: #  5; line:     4-    3; sop:     5; eop:     9; out0:  10
branch: # 10; line:     3-    3; sop:    10; eop:    12; out0:  13; out1:   5; out2:  13; out3:   5
branch: # 13; line:     7-    7; sop:    13; eop:    13; out0:  -2
path #1: 0, 10, 13, 
path #2: 0, 10, 5, 10, 13, 
path #3: 0, 10, 5, 10, 13, 
path #4: 0, 10, 13, 
path #5: 0, 10, 5, 10, 13, 
path #6: 0, 10, 5, 10, 13,

явный.php

<?php
$str = 12345;
for($i=0;$i<=200000000;$i++){
    $str2 = (string)$str;
}

явный.php байт-код

DarkMax:temp yvesleborg$ php -dvld.active=1 -dvld.verbosity=0 -dvld.exececute=0 explicit.php 
filename:       /Users/yvesleborg/temp/explicit.php
function name:  (null)
number of ops:  14
compiled vars:  !0 = $str, !1 = $i, !2 = $str2
line     #* E I O op                           fetch          ext  return  operands
-------------------------------------------------------------------------------------
   2     0  E >   EXT_STMT                                                 
         1        ASSIGN                                                   !0, 12345
   3     2        EXT_STMT                                                 
         3        ASSIGN                                                   !1, 0
         4      > JMP                                                      ->10
   4     5    >   EXT_STMT                                                 
         6        CAST                                          6  ~5      !0
         7        ASSIGN                                                   !2, ~5
   3     8        POST_INC                                         ~7      !1
         9        FREE                                                     ~7
        10    >   IS_SMALLER_OR_EQUAL                              ~8      !1, 200000000
        11        EXT_STMT                                                 
        12      > JMPNZ                                                    ~8, ->5
   7    13    > > RETURN                                                   1

branch: #  0; line:     2-    3; sop:     0; eop:     4; out0:  10
branch: #  5; line:     4-    3; sop:     5; eop:     9; out0:  10
branch: # 10; line:     3-    3; sop:    10; eop:    12; out0:  13; out1:   5; out2:  13; out3:   5
branch: # 13; line:     7-    7; sop:    13; eop:    13; out0:  -2
path #1: 0, 10, 13, 
path #2: 0, 10, 5, 10, 13, 
path #3: 0, 10, 5, 10, 13, 
path #4: 0, 10, 13, 
path #5: 0, 10, 5, 10, 13, 
path #6: 0, 10, 5, 10, 13,

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

На самом делеЧтобы ответить на свой вопрос, вы должны обдумать более сложный вопрос:

При каких обстоятельствах явное приведение производит байт-код, отличный от неявного преобразования.

, и если вы найдетеВ таких обстоятельствах проведите тест, чтобы измерить их производительность.

Если вы хотите выполнить этот квест, вам понадобится компонент pecl vld.Вы можете следовать этому интересному посту , чтобы ознакомиться с vld (обязательно проверьте на pecl и установите соответствующую версию для вашего тестируемого компилятора php)

0 голосов
/ 12 февраля 2019

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

Так что идея проста, я просто создаю сценарий для приведения целого числа, используя методы implicit и explicit 200 миллионов раз чтобы увидеть, есть ли разница.

Я обнаружил, что Нет большой разницы в скорости .Вот скрипт, который я сделал для выполнения тестов.

<?php
$str = 12345;

$startTimeExplicit = microtime(true);
for($i=0;$i<=200000000;$i++){
    $str2 = (string)$str;
}
$endTimeExplicit = microtime(true);
$explicit = round($endTimeExplicit-$startTimeExplicit,6);

$startTimeImplicit = microtime(true);
for($i=0;$i<=200000000;$i++){
    $str2 = "$str";
}
$endTimeImplicit = microtime(true);
$implicit = round($endTimeImplicit-$startTimeImplicit,6);

echo "Average time (Implicit type casting): ".$implicit."<br>";
echo "Average time (Explicit type casting): ".$explicit."<br>";

?>

А вот результаты, которые я получил после многократного выполнения этого скрипта.

Average time (Implicit type casting): 14.815689
Average time (Explicit type casting): 14.614734

Average time (Implicit type casting): 14.56812
Average time (Explicit type casting): 15.190028

Average time (Implicit type casting): 14.649186
Average time (Explicit type casting): 15.587608

Average time (Implicit type casting): 15.522457
Average time (Explicit type casting): 15.566786

Average time (Implicit type casting): 15.235483
Average time (Explicit type casting): 15.333145

Average time (Implicit type casting): 15.972657
Average time (Explicit type casting): 16.161957

Как видите, обаони одинаково быстры.Иногда неявное приведение типов происходит за несколько сотен миллисекунд, а иногда явное.Но в среднем вы не видите большой разницы.

...