Performance Perl速度:$a=$a.$b和$a.=$b之间的差异
我已经把所有的代码和运行信息放在下面了。处理很长的字符串时,标题中的操作速度不同。为什么以及有多少其他操作显示相同的特征? (如果回路小于10^4,则差异可忽略不计。)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
➜ ~ 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的内部内存管理,这取决于操作系统和编译时选项,可能会将内存返回给系统。CheckPerl-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';