我已经把所有的代码和运行信息放在下面。在处理很长的字符串时,标题中的操作速度是不同的。为什么和有多少其他操作表现出相同的特征?
(如果循环低于 10^4,则差异可以忽略不计。)

➜  ~  cat t1.pl
#!/usr/bin/env perl
$a = 'a';

$i = 0;
while ($i < 100000){
  $a .= 'a';
  $i++;
}

➜  ~  time perl t1.pl
perl t1.pl  0.01s user 0.00s system 85% cpu 0.021 total



➜  ~  cat t2.pl
#!/usr/bin/env perl
$a = 'a';

$i = 0;
while ($i < 100000){
  $a = $a.'a';
  $i++;
}

➜  ~  time perl t2.pl
perl t2.pl  0.50s user 0.01s system 99% cpu 0.507 total

最佳答案

运行时不同,因为这些是不同的操作:



这将附加到 $a 。 Perl 中的字符串通常在末尾有更多数据的空间,因此在很多情况下,这只是在字符串中设置单个字节并更改长度信息。



这将从 $a'a' 创建一个新字符串,完成后将 $a 设置为该字符串。因此需要分配至少 $a 大小的第一个内存,并且需要将 $a 的内容复制到该内存中。然后追加完成,然后进行分配,然后内存可以返回给 Perl 的内部内存管理,这取决于操作系统和编译时选项可能会将内存返回给系统。

关于performance - Perl 速度 : difference between $a = $a. $b 和 $a .= $b,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/33821753/

10-13 08:23