当前位置:  开发笔记 > 编程语言 > 正文

Perl:为什么if语句比"和"慢?

如何解决《Perl:为什么if语句比"和"慢?》经验,为你挑选了3个好方法。

在Perl中,条件可以表示为

if (condition) { do something }

或者作为

(condition) and do { do something }

有趣的是,第二种方式似乎要快10%左右.有谁知道为什么?



1> ysth..:

关于下面的deparse的一些评论:

首先,不要使用B :: Terse,它已经过时了.一旦习惯,B :: Concise就能为您提供更好的信息.

其次,你使用给定的文字代码运行它,因此条件被视为一个恰好为真的裸字,因此布尔检查在两种情况下都被优化掉了,这种方法失败了.

第三,没有额外的操作码 - "null"表示已被优化掉的操作码(完全在执行树之外,但仍在解析树中).

这是两个案例的简明执行树,它们显示为相同:

$ perl -MO=Concise,-exec -e'($condition) and do { do something }'
1  <0> enter 
2  <;> nextstate(main 2 -e:1) v
3  <#> gvsv[*condition] s
4  <|> and(other->5) vK/1
5      <$> const[PV "something"] s/BARE
6      <1> dofile vK/1
7  <@> leave[1 ref] vKP/REFC
-e syntax OK
$ perl -MO=Concise,-exec -e'if ($condition) { do something }'
1  <0> enter 
2  <;> nextstate(main 3 -e:1) v
3  <#> gvsv[*condition] s
4  <|> and(other->5) vK/1
5      <$> const[PV "something"] s/BARE
6      <1> dofile vK/1
7  <@> leave[1 ref] vKP/REFC
-e syntax OK



2> Leon Timmerm..:

我已经贬低了它,它真的不应该更快.第一个的操作码树是

LISTOP (0x8177a18) leave [1] 
    OP (0x8176590) enter 
    COP (0x8177a40) nextstate 
    LISTOP (0x8177b20) scope 
        OP (0x81779b8) null [174] 
        UNOP (0x8177c40) dofile 
            SVOP (0x8177b58) const [1] PV (0x81546e4) "something" 

第二个的操作码树是

LISTOP (0x8177b28) leave [1] 
    OP (0x8176598) enter 
    COP (0x8177a48) nextstate 
    UNOP (0x8177980) null 
        LISTOP (0x8177ca0) scope 
            OP (0x81779c0) null [174] 
            UNOP (0x8177c48) dofile 
                SVOP (0x8177b60) const [1] PV (0x81546e4) "something"

我真的不知道后者如何更快.它更多的操作码!



3> DGM..:

这只是表明,如果你不知道如何进行正确的代码分析,就不要做这些事情.这两种方法的速度差异在相同的Big O()速度内(由@Leon Timmermans操作码分析证明) - 基准测试只是根据其他本地条件显示差异,而不一定是您的代码.

@Svante说"和"更快,而@shelfoo说"如果"更快.

我的意思是真的...... 1000万次循环的变化是7百分之一秒?从统计数据来看,这不是更快或更慢......这是相等的.

学习代码重构和Big O()表示法,而不是查看这样的微小时序,如何减少代码中的循环次数......最重要的是,如何使用代码分析器来查看真实的位置瓶颈是.不要担心统计上无关紧要的东西.;)

推荐阅读
爱唱歌的郭少文_
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有