为什么substr-lvalue比4-arg substr快?

问题描述 投票:1回答:2

this question,我们对这两个变体进行基准测试,

substr( $foo, 0, 0 ) = "Hello ";
substr( $foo, 0, 0, "Hello " );

在其中我们发现substr -lvalue是更快。池上说,

4-arg substr比lvalue substr慢(它必须创建一个神奇的标量,并且需要额外的操作)???? – ikegami

被告知,我还以为它会慢很多,只是提到它是因为它是由其他人提出来的。纯粹出于好奇,

在上述用例中,substr-左值为什么比四参数substr快?

perl substr microbenchmark
2个回答
1
投票

这仅仅是一个糟糕的基准测试结果。

复制您的结果时,我在Windows Susbsytem Linux版上的Unbuntu上使用perl。只说性能对系统上的外部因素敏感。

即使在同一台计算机上使用Windows(Strawberry Perl)的本机版本,结果也会出现很大的差异:

                   Rate        substr substr_valute   multiconcat
                  Rate substr_valute        substr   multiconcat
substr_valute 6997958/s            --           -0%          -27%
substr        7007667/s            0%            --          -26%
multiconcat   9533733/s           36%           36%            --

                   Rate        substr substr_valute   multiconcat
substr        6795650/s            --           -0%          -10%
substr_valute 6805545/s            0%            --          -10%
multiconcat   7526593/s           11%           11%            --

                    Rate        substr substr_valute   multiconcat
substr         7513339/s            --          -22%          -28%
substr_valute  9693997/s           29%            --           -6%
multiconcat   10367639/s           38%            7%            --

                    Rate        substr   multiconcat substr_valute
substr         8791152/s            --          -13%          -14%
multiconcat   10139954/s           15%            --           -1%
substr_valute 10240638/s           16%            1%            --

时间太短了,机器太忙了,无法获得准确的读数。

(关于某处的微优化,有一点要注意……)

我讨厌在共享的Linux Web主机上运行基准测试,但是它通常会产生更加一致的结果。今天也不例外。

                   Rate        substr substr_valute   multiconcat
substr        4293130/s            --           -3%          -13%
substr_valute 4407446/s            3%            --          -11%
multiconcat   4938717/s           15%           12%            --

                   Rate substr_valute        substr   multiconcat
substr_valute 4289732/s            --           -2%          -16%
substr        4356113/s            2%            --          -15%
multiconcat   5096889/s           19%           17%            --

所有差异均在3%或以下,这并不重要。据我所知,一个并不比另一个慢。

((我用-3代替了100_000_000。]


0
投票

从5.16.0开始,将lvalue + assign变体优化为4-arg变体(尽管直到5.20.0为止,空出的NOOP分配op仍在执行路径中,这会稍微放慢速度)。

© www.soinside.com 2019 - 2024. All rights reserved.