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)
这是一种绩效衡量问题,特别针对这种情况.谢谢你的帮助!
你的问题实际上是关于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编译器安装相应的版本)
| 归档时间: |
|
| 查看次数: |
69 次 |
| 最近记录: |