检查在Perl中追加字符串的两种方法的性能

时间:2018-07-12 12:51:39

标签: perl

我可以在Perl中使用以下两种方式:

my $str = "hello";
my $o1 = $str." world";
my $o2 = "$str world";

它们做同样的事情,尽管我想知道当谈到性能时它们是否相同。我该如何检查?有专门的在线工具吗?

3 个答案:

答案 0 :(得分:8)

Benchmark是做到这一点的方法。

您要描述的两种方法称为串联和插值,因此我们将在测试中使用这些名称作为标签。

#!/usr/bin/perl

use strict;
use warnings;

use Benchmark;

my $str = 'hello';

# Run this two subroutines for at least 3 CPU seconds.
# That "negative seconds" parameter is possibly the worst
# interface in all of Perl!
timethese(-3, {
  concat => sub { $str . ' world' },
  interp => sub { "$str world" },
});

结果...

$ perl benchmark
Benchmark: running concat, interp for at least 3 CPU seconds...
    concat:  4 wallclock secs ( 3.16 usr +  0.00 sys =  3.16 CPU) @ 32680513.61/s (n=103270423)
    interp:  3 wallclock secs ( 3.22 usr +  0.00 sys =  3.22 CPU) @ 29918605.90/s (n=96337911)

级联的速度稍快[注意:,如注释中所指出的,这确实是正确的-这些测试的差异均在误差范围之内]。但是请注意,我们需要进行大约一亿次测试才能发现这种微小差异。因此,我认为您不必为此担心。

答案 1 :(得分:3)

Test::More通常用于基准测试代码。最好也测试一下基准测试的代码是否提供相同的输出,因此我加入了{{3}}。

#! /usr/bin/perl
use warnings;
use strict;

use Benchmark qw{ cmpthese };

my $var = join "", 'a' .. 'z';
my $string = uc $var;

my $dot = "\$string . ' $var'";
my $dq  = qq("\$string $var");

use Test::More tests => 1;
is  eval $dot,
    eval $dq,
    'same';

cmpthese(-3, {
         dot => $dot,
         dq  => $dq,
});

重复运行的结果似乎是随机的,因此差异可以忽略不计:

1..1
ok 1 - same
          Rate dot  dq
dot 19583087/s  -- -6%
dq  20725520/s  6%  --

1..1
ok 1 - same
          Rate  dq dot
dq  18925046/s  -- -7%
dot 20246124/s  7%  --

答案 2 :(得分:3)

它们不只是相似;它们都产生完全相同的代码。

$ for v in 5.10 5.12 5.14 5.16 5.18 5.20 5.22 5.24 5.26 5.28
do
   diff -u \
      <( "$v"t/bin/perl -MO=Concise,-exec -e'my $x = $str . " world"' 2>&1 ) \
      <( "$v"t/bin/perl -MO=Concise,-exec -e'my $x = "$str world"'    2>&1 ) \
      && echo "$v: identical" \
      || echo "$v: different"
done
5.10: identical
5.12: identical
5.14: identical
5.16: identical
5.18: identical
5.20: identical
5.22: identical
5.24: identical
5.26: identical 
5.28: identical 

因此,性能不会有差异。

顺便说一句,如果您想了解这两者的性能差异,您并不会直截了当;您应该考虑可读性/可维护性。