关于性能:Perl:为什么if语句比” and”慢?

关于性能:Perl:为什么if语句比” and”慢?

Perl: why is the if statement slower than “and”?

在Perl中,条件可以表示为

1
if (condition) { do something }

或as

1
(condition) and do { do something }

有趣的是,第二种方法似乎要快10%。有谁知道为什么吗?


有关以下内容的一些评论:

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

第二,您已经使用给定的文字代码运行了它,因此条件被视为恰好是真实的裸字,因此布尔检查在两种情况下都被优化了,这违背了目的。

第三,没有多余的操作码-"空"表示已被优化的操作码(完全不在执行树中,尽管仍在解析树中)。

这是这两种情况的简洁执行树,它们显示为相同:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
$ 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

这只是演示,如果您不知道如何执行正确的代码配置文件,请不要执行此操作。这两种方法的速度差异在相同的Big O()速度之内(如@Leon Timmermans opcode分析所证明的那样)-基准只是显示基于其他本地条件(不一定是您的代码)的差异。

@Svante说"和"更快,@ shelfoo说"如果"更快。

我的意思是真的……在一千万次循环中,百分之七十分之一秒的变化?从统计上讲,这不是更快或更慢。...相等。

与其像这样的微小时序,不如了解代码重构和Big O()表示法……如何减少代码中的循环次数……以及最重要的是,如何使用代码探查器进行查看真正的瓶颈在哪里。不用担心统计上无关紧要的东西。 ;)


我已经失望了,它真的不应该更快。第一个的操作码树是

1
2
3
4
5
6
7
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"

第二个操作码树是

1
2
3
4
5
6
7
8
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"

我真的不知道后者会如何更快。它还有一个操作码!


在平均之前,您进行了多少次测试?在统计上,非常非常小的偏差是很小的!在很多测试之间,速度有很多差异的原因很多。


根据基准,第二个稍微慢一些。可能与条件有关,但这是一个非常简单的情况的结果:

1
2
3
4
5
6
7
8
<wyn>
use Benchmark;

timethese(10000000, {
    'if' => '$m=5;if($m > 4){my $i=0;}',
    'and' => '$m=5; $m > 4 and do {my $i =0}',
});
</wyn>

结果:

1
2
3
4
5
<wyn>
Benchmark: timing 10000000 iterations of Name1, Name2...
     if:  3 wallclock secs ( 2.94 usr +  0.01 sys =  2.95 CPU) @ 3389830.51/s (n=10000000)
     and:  3 wallclock secs ( 3.01 usr +  0.01 sys =  3.02 CPU) @ 3311258.28/s (n=10000000)
</wyn>


它也可能取决于Perl的版本。您还没有提到。而且无论如何,区别还不足以担心。因此,请使用更有意义的方法。


推荐阅读

    linux测试性能命令?

    linux测试性能命令?,系统,网络,信息,工具,状态,地址,指标,情况,分析,下行,五

    linux中断命令语句?

    linux中断命令语句?,系统,服务,状态,号码,进程,命令,信号,传播,互动,名称,在l

    linux命令错误的是?

    linux命令错误的是?,系统,信息,异常,密码,工具,地址,网络,实时,状态,数据,Lin

    linux条件判断命令?

    linux条件判断命令?,代码,系统,语句,地方,工作,软件,时间,项目,管理,标准,条

    linux性能检测命令?

    linux性能检测命令?,系统,情况,信息,状态,工具,实时,百分比,指标,分析,命令,

    linux命令安条件删除?

    linux命令安条件删除?,系统,命令,不了,通用,名称,文件夹,文件,目录,软件,子

    写5条linux命令语句?

    写5条linux命令语句?,工作,地址,系统,信息,目录,命令,管理,标准,功能,文件,li

    linux命令语句规律?

    linux命令语句规律?,系统,管理,基础,网络,信息,命令,服务,简介,工具,标准,lin

    linux查看性能的命令?

    linux查看性能的命令?,系统,情况,信息,数据,状态,指标,第一,分析,命令,宏观,l

    linux命令查的是啥?

    linux命令查的是啥?,系统,时间,信息,状态,命令,工具,名称,标准,软件,情况,Lin

    linux性能测试命令?

    linux性能测试命令?,数据,系统,工具,标准,设备,地址,情况,基础,网络,环境,如

    linux循环语句命令?

    linux循环语句命令?,地方,增长,数字,语句,流程,名称,工具,代码,数据,条件,Lin

    linux命令3d性能?

    linux命令3d性能?,系统,工具,实时,百分比,信息,分析,软件,情况,网站,建设,Lin

    linux性能管理命令?

    linux性能管理命令?,工具,系统,信息,状态,网络,情况,工作,时间,短信,平均,lin

    linux性能调参命令?

    linux性能调参命令?,工具,工作,信息,网络,分析,系统,地址,实时,管理,状态,在l

    linux性能找不打命令?

    linux性能找不打命令?,系统,实时,软件,名字,分析,信息,情况,工具,电脑,时间,l

    嵌入式linux命令语句?

    嵌入式linux命令语句?,系统,环境,基础,网络,软件,基础知识,服务,设备,管理,