|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
不可能吃饭的时候咬了自己一下舌头就从此不吃饭了不是?放下畏惧,继续努力,咱们是来征服它的,而不是被它征服的,振奋起来吧同志。
咱们都晓得PHP用写时复制来对变量复制做功能优化, 而在之前的三元式中, 却每次城市复制, 这在操作数是大数组的情形下, 会形成功能成绩:
<?php
$a = range(1, 1000);
$i = 0;
$start = microtime(true);
while (++$i < 1000) {
$b = isset($a)? $a : NULL;
}
var_dump(microtime(true) - $start);
比拟, 咱们采取if-else来做一样的功效:
<?php
$a = range(1, 1000);
$i = 0;
$start = microtime(true);
while (++$i < 1000) {
if (isset($a)) {
$b = $a;
} else {
$b = NULL;
}
}
var_dump(microtime(true) - $start);
前者在我的机械上, 运转工夫为: float(0.0448620319366), 而采取if-else则是: float(0.000280006027222)
为此, Arnaud供应了一个patch, 来对三元式做了一个优化, 使得三元式不会每次都复制操作数, 在优化今后, 开首给的例子的运转工夫下降为: float(0.00029182434082031)
The ternary operator always copies its second or third operand, which is very
slow compared to an if/else when the operand is an array for example:
$a = range(0,9);
// this takes 0.3 seconds here:
for ($i = 0; $i < 5000000; ++$i) {
if (true) {
$b = $a;
} else {
$b = $a;
}
}
// this takes 3.8 seconds:
for ($i = 0; $i < 5000000; ++$i) {
$b = true ? $a : $a;
}
I've tried to reduce the performance hit by avoiding the copy when possible
(patch attached).
Benchmark:
Without patch: (the numbers are the time taken to run the code a certain
amount of times)
$int = 0;
$ary = array(1,2,3,4,5,6,7,8,9);
true ? 1 : 0 0.124
true ? 1+0 : 0 0.109
true ? $ary : 0 2.020 !
true ? $int : 0 0.103
true ? ${'ary'} : 0 2.290 !
true ?: 0 0.091
1+0 ?: 0 0.086
$ary ?: 0 2.151 !
${'var'} ?: 0 2.317 !
With patch:
true ? 1 : 0 0.124
true ? 1+0 : 0 0.195
true ? $ary : 0 0.103
true ? $int : 0 0.089
true ? ${'ary'} : 0 0.103
true ?: 0 0.086
1+0 ?: 0 0.159
$cv ?: 0 0.090
${'var'} ?: 0 0.089
The array copying overhead is eliminated. There is however a slowdown in some
of the cases, but overall there is no completely unexpected performance hit as
it is the case currently.
不外, 仍是要提示下: PHP 5.4还处于开辟阶段, 在终究release之前, 任何新特征都能够被调剂或更改. 假如人人有任何建议, 也接待反应, 匡助咱们使得PHP变得更好.
感谢
给你的建议是,有些最常用的语句是需要记住的 比如if for while这些、其他的一般语句你只要知道有这个函数或者有这个功能就可以了,当你用的时候你可以凭借记忆搜索就可以了。 |
|