Performance implications of using the Switch module
From: GreenLight (google_at_milbaugh.com)
Date: 04/30/04
- Next message: Florence HENRY: "Problem with global variables"
- Previous message: Robin: "Re: WHAT IS THE POINT OF FORMMAIL ?"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Date: 30 Apr 2004 11:05:33 -0700
I hate looking at rows and rows of elsif statements as much as the
next person, but using the Switch module just doesn't cut it. I wrote:
use strict;
use warnings;
use Benchmark;
use Switch;
sub use_if() {
my ($tag, $value);
my @parsed;
my @tags = (
"TAG001^VALUE001", "TAG002^VALUE002", "TAG003^VALUE003",
"TAG004^VALUE004", "TAG005^VALUE005",
"TAG006^VALUE006", "TAG007^VALUE007", "TAG008^VALUE008",
"TAG009^VALUE009", "TAG010^VALUE010"
);
foreach my $next (@tags) {
($tag, $value) = ($next =~ /^(.*?)\^(.*?)$/);
if ($tag eq 'TAG001') { push @parsed, $value }
elsif ($tag eq 'TAG002') { push @parsed, $value }
elsif ($tag eq 'TAG003') { push @parsed, $value }
elsif ($tag eq 'TAG004') { push @parsed, $value }
elsif ($tag eq 'TAG005') { push @parsed, $value }
elsif ($tag eq 'TAG006') { push @parsed, $value }
elsif ($tag eq 'TAG007') { push @parsed, $value }
elsif ($tag eq 'TAG008') { push @parsed, $value }
elsif ($tag eq 'TAG009') { push @parsed, $value }
elsif ($tag eq 'TAG010') { push @parsed, $value }
else { die "Bad tag!" }
}
}
sub use_switch() {
my ($tag, $value);
my @parsed;
my @tags = (
"TAG001^VALUE001", "TAG002^VALUE002", "TAG003^VALUE003",
"TAG004^VALUE004", "TAG005^VALUE005",
"TAG006^VALUE006", "TAG007^VALUE007", "TAG008^VALUE008",
"TAG009^VALUE009", "TAG010^VALUE010"
);
foreach my $next (@tags) {
($tag, $value) = ($next =~ /^(.*?)\^(.*?)$/);
switch ($tag) {
case "TAG001" { push @parsed, $value }
case "TAG002" { push @parsed, $value }
case "TAG003" { push @parsed, $value }
case "TAG004" { push @parsed, $value }
case "TAG005" { push @parsed, $value }
case "TAG006" { push @parsed, $value }
case "TAG007" { push @parsed, $value }
case "TAG008" { push @parsed, $value }
case "TAG009" { push @parsed, $value }
case "TAG010" { push @parsed, $value }
else { die "Bad tag!" }
}
}
}
timethese (100000, {
"Using 'if'" => \&use_if,
"Using 'switch'" => \&use_switch
});
__END__
These subroutines adequately represent tasks performed thousands of
times per day at my client's site.
And the results:
Benchmark: timing 100000 iterations of Using 'if', Using 'switch'...
Using 'if': 17 wallclock secs (16.48 usr + 0.00 sys = 16.48 CPU) @
6066.49/s (n=100000)
Using 'switch': 153 wallclock secs (150.68 usr + 0.00 sys = 150.68
CPU) @ 663.68/s (n=100000)
Using "switch" was nearly an order of magnitude slower.
Now my real question: Does anyone know if the "forthcoming" Perl6
version (given/when, as described in "perldoc switch") will offer
better performance (that is, is anyone actually using any early
release and can comment upon the performance)?
- Next message: Florence HENRY: "Problem with global variables"
- Previous message: Robin: "Re: WHAT IS THE POINT OF FORMMAIL ?"
- Messages sorted by: [ date ] [ thread ] [ subject ] [ author ]
Relevant Pages
|