有没有大神能解释一下if和?:效率上的差距产生的原因

代码和结果在后面

主要问题有3个:

1、为何返回值是变量的时候if和?:的效率不相伯仲?

2、为何返回值是字面值时候?:会慢很多?

3、为何执行的是else以及:后的情况时效率反而高?

$_bpt;
function beginprofile($text = null)
{
global $_bpt;
if($text !== null)
echo $text, ‘: ‘;
$_bpt = microtime(true);
}
function endprofile()
{
global $_bpt;
echo microtime(true) – $_bpt, php_eol;
}
function test1($a, $b)
{
echo ‘[test1] a: ‘, $a, ‘ b: ‘, $b, php_eol;
$r = null;
$i = null;
beginprofile(‘if’);
for($i = 0; $i < 10000000; ++$i) if($a > $b)
$r = $a;
else
$r = $b;
endprofile();
beginprofile(‘ternary’);
for($i = 0; $i < 10000000; ++$i) $r = $a > $b ? $a : $b;
endprofile();
echo php_eol;
}
function test2($a, $b)
{
echo ‘[test2] a: ‘, $a, ‘ b: ‘, $b, php_eol;
$r = null;
$i = null;
beginprofile(‘if’);
for($i = 0; $i < 10000000; ++$i) if($a > $b)
$r = 1;
else
$r = -1;
endprofile();
beginprofile(‘ternary’);
for($i = 0; $i < 10000000; ++$i) $r = $a > $b ? 1 : -1;
endprofile();
echo php_eol;
}
test1(0, 1);
test1(1, 0);
test2(0, 1);
test2(1, 0);

本机5.5.12 cli的结果

[test1] a: 0 b: 1
if: 0.40560913085938
ternary: 0.47002696990967
[test1] a: 1 b: 0
if: 0.69283294677734
ternary: 0.65520095825195
[test2] a: 0 b: 1
if: 0.3744010925293
ternary: 0.5928008556366
[test2] a: 1 b: 0
if: 0.59280109405518
ternary: 0.71760106086731

某在线网站5.3.3的结果

[test1] a: 0 b: 1
if: 0.89750385284424
ternary: 0.76072287559509
[test1] a: 1 b: 0
if: 1.1494359970093
ternary: 0.78078508377075
[test2] a: 0 b: 1
if: 0.68948316574097
ternary: 0.99170303344727
[test2] a: 1 b: 0
if: 1.0860159397125
ternary: 1.4367680549622

回复讨论(解决方案)

没有看到 return,不知 返回 是何意

观察运行结果,可知:if else 结构的效率较 三元运算略高

由于 php 是解释执行的,所以处理常量串要比处理变量慢(多一个甄别环节)

观察运行结果,可知:if else 结构的效率较 三元运算略高

观察有误

这种情况效率相当

if($a > $b) $r = $a; else $r = $b;
$r = $a > $b ? $a : $b;

这种情况if效率高

if($a > $b) $r = 1; else $r = -1;
$r = $a > $b ? 1 : -1;

我想知道的是为什么,不是观察结果

没有看到 return,不知 返回 是何意

返回的意思是指无论$r = $a或者$r = $a > $b ? $a : $b;这样的表达式计算后的值

test1里使用的是变量,test2里直接写的数字

由于 php 是解释执行的,所以处理常量串要比处理变量慢(多一个甄别环节)

常量比变量快这个道理我懂,但问题不是这个。

变量是地址引用

数值需要开辟内存临时存放。

问题是,搞清楚这两个效率差异也并不能给日常代码编写带来多大变化.当然,如果你打算做些扩展开发的话,直接去看下php的c源码,读源码应该是最根本的了解途径吧.顺便悄悄告诉楼主,php是开源的,读源码不要钱.

变量是地址引用

数值需要开辟内存临时存放。

标题是if和?:的比较,谁问变量和数值了?

http://bbs.csdn.net/topics/350225681#post-360992025

变量是地址引用

数值需要开辟内存临时存放。

标题是if和?:的比较,谁问变量和数值了?

你如果要简单回答的话就是因为if他的opcode只有8次操作,而?:则有9次,前者判断之后直接赋值,而无论后者判断是否成功都会多开一个临时变量,然后再赋值。同时前者生成的赋值都是assign,而后者生成的分别是qm_assign_var和qm_assign。至于解析器是不是有分支预判这个我不确定,这些你都可以自己去看php源码。

因为if语句需要隐式声明一个bool变量并对其赋值操作…

因为if语句需要隐式声明一个bool变量并对其赋值操作…

如果不知道麻烦不要来误导我了好不?

我说的是
php,不是c#

而且
快的是if,不是三目

Posted in 未分类

发表评论