这只是一个糟糕的基准结果。
当我复制你的结果时,我在 Linux 的 Windows 子系统上的 Ubuntu 上使用了 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% --
(I used -3
代替100_000_000
.)
所有差异均为 3% 或更少,并不显着。据我所知,其中一个并不比另一个慢。
事实上,人们不应该期望有任何差异。正如戴夫·米切尔所指出的,substr( $foo, 0, 0 ) = "Hello ";
被优化成几乎等同于substr( $foo, 0, 0, "Hello " );
自 5.16 起(在 5.20 中有所改进)。
$ perl -MO=Concise,-exec -e'substr( $foo, 0, 0, "Hello " );'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <#> gvsv[*foo] s
4 <$> const[IV 0] s
5 <$> const[IV 0] s
6 <$> const[PV "Hello "] s
7 <@> substr[t2] vK/4
8 <@> leave[1 ref] vKP/REFC
-e syntax OK
$ perl -MO=Concise,-exec -e'substr( $foo, 0, 0 ) = "Hello ";'
1 <0> enter
2 <;> nextstate(main 1 -e:1) v:{
3 <$> const[PV "Hello "] s
4 <#> gvsv[*foo] s
5 <$> const[IV 0] s
6 <$> const[IV 0] s
7 <@> substr[t2] vKS/REPL1ST,3
8 <@> leave[1 ref] vKP/REFC
-e syntax OK
(唯一的区别是操作数传递的顺序,这是使用REPL1ST
flag.)