从this question,我们对这两个变体进行基准测试,
substr( $foo, 0, 0 ) = "Hello ";
substr( $foo, 0, 0, "Hello " );
在其中我们发现substr
-lvalue是更快。池上说,
4-arg substr比lvalue substr慢(它必须创建一个神奇的标量,并且需要额外的操作)???? – ikegami
被告知,我还以为它会慢很多,只是提到它是因为它是由其他人提出来的。纯粹出于好奇,
在上述用例中,substr
-左值为什么比四参数substr
快?
这仅仅是一个糟糕的基准测试结果。
复制您的结果时,我在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
。]
从5.16.0开始,将lvalue + assign变体优化为4-arg变体(尽管直到5.20.0为止,空出的NOOP分配op仍在执行路径中,这会稍微放慢速度)。