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

Poopaye 2017-02-21 02:42:18
代码和结果在后面
主要问题有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
...全文
286 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
Poopaye 2017-02-24
  • 打赏
  • 举报
回复
引用 8 楼 huajie1988 的回复:
[quote=引用 6 楼 shingoscar 的回复:] [quote=引用 4 楼 fdipzone 的回复:] 变量是地址引用 数值需要开辟内存临时存放。
标题是if和?:的比较,谁问变量和数值了?[/quote] 你如果要简单回答的话就是因为if他的opcode只有8次操作,而?:则有9次,前者判断之后直接赋值,而无论后者判断是否成功都会多开一个临时变量,然后再赋值。同时前者生成的赋值都是ASSIGN,而后者生成的分别是QM_ASSIGN_VAR和QM_ASSIGN。至于解析器是不是有分支预判这个我不确定,这些你都可以自己去看PHP源码。[/quote] 谢谢,我还是读下源码吧。
Poopaye 2017-02-24
  • 打赏
  • 举报
回复
引用 9 楼 fdipzone 的回复:
因为if语句需要隐式声明一个bool变量并对其赋值操作...
如果不知道麻烦不要来误导我了好不? 我说的是PHP,不是C# 而且快的是if,不是三目
傲雪星枫 2017-02-23
  • 打赏
  • 举报
回复
因为if语句需要隐式声明一个bool变量并对其赋值操作...
huajie1988 2017-02-23
  • 打赏
  • 举报
回复
引用 6 楼 shingoscar 的回复:
[quote=引用 4 楼 fdipzone 的回复:] 变量是地址引用 数值需要开辟内存临时存放。
标题是if和?:的比较,谁问变量和数值了?[/quote] 你如果要简单回答的话就是因为if他的opcode只有8次操作,而?:则有9次,前者判断之后直接赋值,而无论后者判断是否成功都会多开一个临时变量,然后再赋值。同时前者生成的赋值都是ASSIGN,而后者生成的分别是QM_ASSIGN_VAR和QM_ASSIGN。至于解析器是不是有分支预判这个我不确定,这些你都可以自己去看PHP源码。
Poopaye 2017-02-23
  • 打赏
  • 举报
回复
引用 4 楼 fdipzone 的回复:
变量是地址引用 数值需要开辟内存临时存放。
标题是if和?:的比较,谁问变量和数值了?
Frank_cic 2017-02-23
  • 打赏
  • 举报
回复
问题是,搞清楚这两个效率差异也并不能给日常代码编写带来多大变化.当然,如果你打算做些扩展开发的话,直接去看下php的c源码,读源码应该是最根本的了解途径吧.顺便悄悄告诉楼主,PHP是开源的,读源码不要钱.
傲雪星枫 2017-02-22
  • 打赏
  • 举报
回复
变量是地址引用 数值需要开辟内存临时存放。
Poopaye 2017-02-21
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
没有看到 return,不知 返回 是何意
返回的意思是指无论$r = $a或者$r = $a > $b ? $a : $b;这样的表达式计算后的值 test1里使用的是变量,test2里直接写的数字
引用 1 楼 xuzuning 的回复:
由于 php 是解释执行的,所以处理常量串要比处理变量慢(多一个甄别环节)
常量比变量快这个道理我懂,但问题不是这个。
Poopaye 2017-02-21
  • 打赏
  • 举报
回复
引用 1 楼 xuzuning 的回复:
观察运行结果,可知: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;
我想知道的是为什么,不是观察结果
xuzuning 2017-02-21
  • 打赏
  • 举报
回复
没有看到 return,不知 返回 是何意 观察运行结果,可知:if else 结构的效率较 三元运算略高 由于 php 是解释执行的,所以处理常量串要比处理变量慢(多一个甄别环节)

21,880

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧