我可以在Perl中使用以下两种方式:
my $str = "hello";
my $o1 = $str." world";
my $o2 = "$str world";
它们做同样的事情,尽管我想知道当谈到性能时它们是否相同。我该如何检查?有专门的在线工具吗?
答案 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
因此,性能不会有差异。
顺便说一句,如果您想了解这两者的性能差异,您并不会直截了当;您应该考虑可读性/可维护性。