http://qs321.pair.com?node_id=161892


in reply to Re: Shift versus Sanity
in thread Shift versus Sanity

sorry juerd, can't agree. another common idiom that noone's mentioned is this:

sub do_stuff { my $this = shift; my $session = shift || die "Missing req'd Session argument"; my $cgi = shift || new CGI (); ... }

aesthetics aside, here are some hard figures on efficiency (slightly reformatted):

[matt@dirty matt]$ ./test_arg_passing.pl Benchmark: timing 2000000 iterations of argumentative_1arg, argumentative_3args, direct_1arg, direct_3args, shifty_1arg, shifty_3args... argumentative_1arg: 17 wallclock secs (17.69 usr + 0.01 sys = 17.70 CPU) @ 112994.35/s (n=2000000) argumentative_3args: 21 wallclock secs (21.93 usr + 0.02 sys = 21.95 CPU) @ 91116.17/s (n=2000000) direct_1arg: 10 wallclock secs (10.86 usr + 0.04 sys = 10.90 CPU) @ 183486.24/s (n=2000000) direct_3args: 13 wallclock secs (12.24 usr + 0.02 sys = 12.26 CPU) @ 163132.14/s (n=2000000) shifty_1arg: 17 wallclock secs (18.07 usr + 0.03 sys = 18.10 CPU) @ 110497.24/s (n=2000000) shifty_3args: 23 wallclock secs (23.91 usr + 0.01 sys = 23.92 CPU) @ 83612.04/s (n=2000000) total: 42000000

not much of a difference, though the triple shift example is a bit pathological. here's the code for the above:

#!/usr/bin/perl -w use Benchmark; use strict; package ArgTest; sub shifty_1arg { my $this = shift; my $first_arg = shift; $$this += $first_arg; } sub shifty_3args { my $this = shift; my $first_arg = shift; my $second_arg = shift; my $third_arg = shift; $$this += $first_arg + $second_arg + $third_arg; } sub argumentative_1arg { my( $this, $first_arg ) = @_; $$this += $first_arg; } sub argumentative_3args { my( $this, $first_arg, $second_arg, $third_arg ) = @_; $$this += $first_arg + $second_arg + $third_arg; } sub direct_1arg { ${$_[0]} += $_[1]; } sub direct_3args { ${$_[0]} += $_[1] + $_[2] + $_[3]; } sub value { return ${$_[0]} } package main; my $total; bless( my $object = \$total, 'ArgTest' ); my @args = ( 1 .. 3 ); timethese( 2_000_000, { shifty_1arg => sub { $object->shifty_1arg( @args ) }, argumentative_1arg => sub { $object->argumentative_1arg( @args ) }, direct_1arg => sub { $object->direct_1arg( @args ) }, shifty_3args => sub { $object->shifty_3args( @args ) }, argumentative_3args => sub { $object->argumentative_3args( @args ) }, direct_3args => sub { $object->direct_3args( @args ) }, } ); print "total: " . $object->value . "\n";

matt

Replies are listed 'Best First'.
Re: Re: Re: Shift versus Sanity
by Juerd (Abbot) on Apr 25, 2002 at 09:58 UTC

    sub do_stuff { my $this = shift; my $session = shift || die "Missing req'd Session argument"; my $cgi = shift || new CGI (); ... }

    As said, I think that's horrible.

    sub do_stuff { my ($self, $session, $cgi) = @_; croak 'Session not optional' unless $session; $cgi ||= CGI->new(); ... }
    I call my objects $self, not $this. You can see the three arguments in a single line, instead of spread over three.

    esthetics aside, here are some hard figures on efficiency (slightly reformatted)

    I am starting to think that you didn't read my post, and are only commenting on the piece of code. Efficiency is important, but not more important than readability and maintainability. Whenever efficiency is important, you probably should not be using OO.

    - Yes, I reinvent wheels.
    - Spam: Visit eurotraQ.
    

      of course i read your post; the original post was about the efficiency of the various techniques! i generally prefer the shifting technique, perhaps cause my editor nicely syntax-colours the my's. 90% of the time it's purely aesthetics, though sometimes one method will lend itself to a particular technique; such as when the second or third argument is a (long) list or hash. TIMTOWTDI.

      besides, it's going to be a moot point in perl6; everything will be named in the method signature.

      but i agree. readability and maintainability are almost always preferable to 5% faster execution. there's no way i could hold a team of 6 and 100K lines of perl together if i didn't think so :-)