Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Performance Perl速度:$a=$a.$b和$a.=$b之间的差异_Performance_Perl_Operations - Fatal编程技术网

Performance Perl速度:$a=$a.$b和$a.=$b之间的差异

Performance Perl速度:$a=$a.$b和$a.=$b之间的差异,performance,perl,operations,Performance,Perl,Operations,我已经把所有的代码和运行信息放在下面了。处理很长的字符串时,标题中的操作速度不同。为什么以及有多少其他操作显示相同的特征? (如果回路小于10^4,则差异可忽略不计。) ➜ ~ cat t1.pl #!/usr/bin/env perl $a='a'; $i=0; 而($i

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

➜  ~  cat t1.pl
#!/usr/bin/env perl
$a='a';
$i=0;
而($i<100000){
$a.='a';
$i++;
}
➜  ~  时间perlt1.pl
perl t1.pl 0.01s用户0.00s系统85%cpu总量0.021
➜  ~  类别t2.pl
#!/usr/bin/env perl
$a='a';
$i=0;
而($i<100000){
$a=$a.‘a’;
$i++;
}
➜  ~  时间perlt2.pl
perl t2.pl 0.50s用户0.01s系统99%cpu总量0.507

运行时不同,因为它们是不同的操作:

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


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

Check
Perl-MO=concrete-e'$a=$a.$b'
vs.
Perl-MO=concrete-e'$a.=$b'
。我猜这有点像Trace。我将尝试学习这一点,然后理解输出。谢谢,非常清楚。非常感谢。那么这是否意味着$a+=2和$a=$a+2不会发生同样的事情?仅限字符串@Steffen@RodenLuo:这些操作仍然不同(添加与添加和分配),因此会有所不同。但是它不会像在字符串测试中那样明显,因为那里的内存分配和复制要少得多。哦,好的,我明白了。非常感谢你!Re“完成此操作后,将$a设置为该字符串”,这实际上是非常有效的,因为它只需将字符串缓冲区从临时传输到
$a
,而不是(放大和)复制。[请注意,即使在
perl-MDevel::Peek-e'$a=“abcdef”Dump($a);$a=substr($a,0,-1),“g”Dump($a);“
]
$a=$a中不需要重新分配,PV地址也会发生变化$b
确实创建了一个新的标量,需要复制
$a
,但只需复制一次(每次循环)。
➜  ~  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 .= 'a';
$a = $a.'a';