PHP中更好/更快/更高效的是什么?
使用额外变量:
$dateStep = new DateInterval('P1D'); for($di = 0; $di <= $dateInterval; ++$di) { $theDate = ($di > 0) ? $startDate->add($dateStep) : $startDate; ... }
或者每次需要时创建对象:
for($di = 0; $di <= $dateInterval; ++$di) { $theDate = ($di > 0) ? $startDate->add(new DateInterval('P1D')) : $startDate; ... }
我投票给第一个选项,但我在PHP中的优化和性能知识非常有限.
编辑:似乎,我没有表达足够的,但我特别要求这样的场景 – 当对象的创建返回静态值时,在后续循环中反复使用.
解决方法
从另一个角度来看这个,让我们来看看脚本和操作码:
SCRIPT1:
<?PHP $dateStep = new DateInterval('P1D'); $dateInterval = 5; $startDate = new DateTime(); for($di = 0; $di <= $dateInterval; ++$di) { $theDate = ($di > 0) ? $startDate->add($dateStep) : $startDate; //... }
操作码:
number of ops: 26 compiled vars: !0 = $dateStep,!1 = $dateInterval,!2 = $startDate,!3 = $di,!4 = $theDate line # * op fetch ext return operands --------------------------------------------------------------------------------- 3 0 > FETCH_CLASS 4 :0 'DateInterval' 1 NEW $1 :0 2 SEND_VAL 'P1D' 3 DO_FCALL_BY_NAME 1 4 ASSIGN !0,$1 4 5 ASSIGN !1,5 5 6 FETCH_CLASS 4 :5 'DateTime' 7 NEW $6 :5 8 DO_FCALL_BY_NAME 0 9 ASSIGN !2,$6 7 10 ASSIGN !3,0 11 > IS_SMALLER_OR_EQUAL ~10 !3,!1 12 > JMPZNZ F ~10,->25 13 > PRE_INC !3 14 > JMP ->11 9 15 > IS_SMALLER ~12 0,!3 16 > JMPZ ~12,->22 17 > INIT_METHOD_CALL !2,'add' 18 SEND_VAR !0 19 DO_FCALL_BY_NAME 1 $14 20 QM_ASSIGN_VAR $15 $14 21 > JMP ->23 22 > QM_ASSIGN_VAR $15 !2 23 > ASSIGN !4,$15 12 24 > JMP ->13 25 > > RETURN 1
SCRIPT2:
<?PHP $dateInterval = 5; $startDate = new DateTime(); for($di = 0; $di <= $dateInterval; ++$di) { $theDate = ($di > 0) ? $startDate->add(new DateInterval('P1D')) : $startDate; // ... }
操作码:
number of ops: 25 compiled vars: !0 = $dateInterval,!1 = $startDate,!2 = $di,!3 = $theDate line # * op fetch ext return operands --------------------------------------------------------------------------------- 4 0 > ASSIGN !0,5 5 1 FETCH_CLASS 4 :1 'DateTime' 2 NEW $2 :1 3 DO_FCALL_BY_NAME 0 4 ASSIGN !1,$2 7 5 ASSIGN !2,0 6 > IS_SMALLER_OR_EQUAL ~6 !2,!0 7 > JMPZNZ A ~6,->24 8 > PRE_INC !2 9 > JMP ->6 9 10 > IS_SMALLER ~8 0,!2 11 > JMPZ ~8,->21 12 > INIT_METHOD_CALL !1,'add' 13 FETCH_CLASS 4 :10 'DateInterval' 14 NEW $11 :10 15 SEND_VAL 'P1D' 16 DO_FCALL_BY_NAME 1 17 SEND_VAR_NO_REF 0 $11 18 DO_FCALL_BY_NAME 1 $13 19 QM_ASSIGN_VAR $14 $13 20 > JMP ->22 21 > QM_ASSIGN_VAR $14 !1 22 > ASSIGN !3,$14 12 23 > JMP ->8 24 > > RETURN 1
现在您可以在第二个脚本的操作码中看到它每次迭代都会创建一个新的类实例,并且您创建了一个巨大的开销,这似乎是您不需要的(在第二个操作码中查看#* 13 – 16),所以首先,您要创建完全不必要的新实例,然后再降低性能.
因此,只要您在每次迭代时都不需要一个全新的类,第一个脚本就更适合您,因为它只创建一次DateInterval对象并将其分配给变量.
还有一点额外的信息:
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。