在转换为字符串时,(string)$ value和"$ value"之间的速度更快

xSa*_*tar 2 php casting php-internals php-7

在PHP中,假设$value = 12345;(整数),$value从整数转换为字符串时速度更快;

$value = (string)$value;
Run Code Online (Sandbox Code Playgroud)

要么

$value = "$value";
Run Code Online (Sandbox Code Playgroud)

这是一种绩效衡量问题,特别针对这种情况.谢谢你的帮助!

Yve*_*org 6

你的问题实际上是关于php解释器的功效,以及它如何转换php code(你编写php bytecode的那个)(运行的那个,可能实际上消耗时间和资源).如果我接受p01ymath的实验,并将其分解:

implicit.php

<?php
$str = 12345;
for($i=0;$i<=200000000;$i++){
    $str2 = "$str";
}
Run Code Online (Sandbox Code Playgroud)

implicit.php字节码

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,
Run Code Online (Sandbox Code Playgroud)

explicit.php

<?php
$str = 12345;
for($i=0;$i<=200000000;$i++){
    $str2 = (string)$str;
}
Run Code Online (Sandbox Code Playgroud)

explicit.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,
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,两个片段都产生完全相同的字节码(您可以从任何精心设计的编译器/解释器中获得).因此,上面的实验仅测量引擎的实际运行时性能,因为它在运行时对字节码进行排序,并且在运行的盒子(芯片组)上进行排序.

要真正回答你自己的问题,你必须思考棘手的问题:

在哪种情况下,显式转换会从隐式转换生成不同的字节码.

如果您发现这种情况,请进行测试以测量其各自的性能.

如果你想追求这个任务,你将需要这个pecl vld组件.你可以按照这个有趣的帖子来熟悉vld(一定要检查pecl,并为你正在测试的php编译器安装相应的版本)