Groups | Search | Server Info | Keyboard shortcuts | Login | Register [http] [https] [nntp] [nntps]


Groups > comp.lang.perl.misc > #8654

Re: this should work

From Rainer Weikusat <rweikusat@mssgmbh.com>
Newsgroups comp.lang.perl.misc
Subject Re: this should work
Date 2013-07-11 13:42 +0100
Message-ID <87li5dclp5.fsf@sapphire.mobileactivedefense.com> (permalink)
References <krkm21$19jd$1@news.ntua.gr> <100720131549354102%jimsgibson@gmail.com> <87a9ltqw5i.fsf@sapphire.mobileactivedefense.com> <5ri2ba-85p1.ln1@anubis.morrow.me.uk>

Show all headers | View raw


Ben Morrow <ben@morrow.me.uk> writes:
> Quoth Rainer Weikusat <rweikusat@mssgmbh.com>:
>> Jim Gibson <jimsgibson@gmail.com> writes:
>> 
>> [...]
>> 
>> > foreach my $dir (qw/commands_pre commands_post/) { 
>> >   my $tmpdir = "/tmp/$dir"; 
>> >   print "$tmpdir\n" 
>> > }
>> 
>> The perl compiler doesn't do invariant code motion because whether or
>> not some code is 'invariant' cannot generally be decided at compile
>> time.
>
> I don't know what you mean by that, but...

In this case, this would be transforming the

for (...) {
	my $tmp = 'ar!';
}

to

my $tmp;
for (...) {
	$tmp = 'ar!';
}

because the 'my $tmp' is invariant code: It's effective result never
changes throughout the loop.

>
>> Because of this, the loop body above behave exactly as written
>> down: For each iteration, it creates a new my variable and assigns a
>> value to it.
>
> ...this is nonsense. Perl quite deliberately reuses the same variable
> every time, to avoid the allocation overhead, unless you pass a (strong)
> reference to it outside the loop. Try it and see:
>
>     use Scalar::Util qw/refaddr/;
>
>     for (1, 2, 3) {
>         my $tmp = "foo/$_";
>         say refaddr \$tmp;
>     }

Maybe some versions of Perl do that (which would be an
improvement). But the one I tested certainly doesn't. Assuming the
following code

-------------
use Benchmark;

sub in_loop
{
	for (0 .. 100) {
		my $a = $_ + 1;
	}
}

sub out_of_loop
{
	my $a;
	for (0 .. 100) {
		$a = $_ + 1
	}
}

timethese(-2,
	  {
		in_loop => \&in_loop,
		out_of_loop => \&out_of_loop
	   });
-------------

the loop in in_loop is translated to (perl -MO=Concise,in_loop, perl
5.10.1)

e                 <0> iter s ->f
-                 <@> lineseq sK ->-
7                    <;> nextstate(main 596 a.pl:6) v ->8
c                    <2> sassign vKS/2 ->d
a                       <2> add[t5] sK/2 ->b
-                          <1> ex-rv2sv sK/1 ->9
8                             <#> gvsv[*_] s ->9
9                          <$> const[IV 1] s ->a
b                       <0> padsv[$a:596,597] sRM*/LVINTRO ->c
d                    <0> unstack s ->e

[b] is what creates the variable.

For out_of_loop, this looks like this:

e                 <0> iter s ->f
-                 <@> lineseq sK ->-
9                    <;> nextstate(main 601 a.pl:14) v ->a
c                    <2> add[$a:600,603] sK/TARGMY,2 ->d
-                       <1> ex-rv2sv sK/1 ->b
a                          <#> gvsv[*_] s ->b
b                       <$> const[IV 1] s ->c
d                    <0> unstack s ->e

and the padsv ... LVINTRO happens in the subroutine preamble.

Running the program here yields the expected result that out_of_loop
executes at about 1.43 times the speed of in_loop.

>> Unless there's a specific reason why this behaviour would
>> be desirable, such constructs should be avoided[*].
>> 
>> [*] This is also true for the more general case of 'Yes we can!'
>> variable declarations: Just because a new my variable can be created
>> as part of some construct doesn't mean there's a good reason why it
>> should be created, not only because this takes time but more
>> importantly, because it makes the code more complicated, especially as
>> real world code isn't going to have nice and small two lines blocks
>> but rather big and ugly 500 lines blocks with 5 hundred lines blocks
>> inside and each of these further subdivided into dozens of line
>> blocks (this is probably still and optimistic estimate).
>
> Speak for yourself. *My* real-world code doesn't look like that.

I speak for code written by people other than me I happen to know. I'm
completely willing to believe that you either don't know any code
written by other people or only code written by other people who are
above-average skilled programmers and that you're one yourself,
however, that doesn't change this observation.

Back to comp.lang.perl.misc | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

this should work "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-11 01:08 +0300
  Re: this should work Jim Gibson <jimsgibson@gmail.com> - 2013-07-10 15:49 -0700
    Re: this should work George Mpouras <nospam.gravitalsun.noadsplease@hotmail.noads.com> - 2013-07-11 09:42 +0300
      Re: this should work tmcd@panix.com (Tim McDaniel) - 2013-07-11 08:02 +0000
        Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-11 12:45 +0100
          Re: this should work George Mpouras <nospam.gravitalsun.noadsplease@hotmail.noads.com> - 2013-07-11 15:03 +0300
            Re: this should work "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-11 14:52 +0200
              Re: this should work George Mpouras <nospam.gravitalsun.noadsplease@hotmail.noads.com> - 2013-07-11 16:01 +0300
                Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 14:29 +0100
        Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 14:27 +0100
          Re: this should work Peter Makholm <peter@makholm.net> - 2013-07-11 15:50 +0200
      Re: this should work Jürgen Exner <jurgenex@hotmail.com> - 2013-07-11 03:34 -0700
        Re: this should work George Mpouras <nospam.gravitalsun.noadsplease@hotmail.noads.com> - 2013-07-11 13:55 +0300
          Re: this should work Peter Makholm <peter@makholm.net> - 2013-07-11 13:57 +0200
          Re: this should work Shmuel (Seymour J.) Metz <spamtrap@library.lspace.org.invalid> - 2013-07-11 09:10 -0400
            Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-11 21:35 +0100
    Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 10:32 +0100
      Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-11 12:51 +0100
        Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 13:42 +0100
          Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-11 16:23 +0100
            Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 17:17 +0100
              Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 18:08 +0100
              Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-11 21:48 +0100
          Re: this should work Keith Keller <kkeller-usenet@wombat.san-francisco.ca.us> - 2013-07-11 10:32 -0700
            Re: this should work Jürgen Exner <jurgenex@hotmail.com> - 2013-07-11 10:48 -0700
              Re: this should work "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-11 21:38 +0300
              Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 23:08 +0100
            Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 18:48 +0100
              Re: this should work Charles DeRykus <derykus@gmail.com> - 2013-07-11 12:03 -0700
                Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-11 22:02 +0100
                Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 23:06 +0100
                Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-12 01:04 +0100
                Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-15 13:41 +0100
                Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-15 14:07 +0100
                Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-15 15:05 +0100
                Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-15 21:02 +0100
                Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-15 23:58 +0100
                Re: this should work tmcd@panix.com (Tim McDaniel) - 2013-07-15 17:23 +0000
                Re: this should work Charlton Wilbur <cwilbur@chromatico.net> - 2013-07-15 15:40 -0400
              Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-11 21:58 +0100
                Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-11 23:17 +0100
                [OT] scoping Ivan Shmakov <oneingray@gmail.com> - 2013-07-12 07:50 +0000
                Re: [OT] scoping aka 'new holes in old shoes' Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-12 11:53 +0100
                [OT] engineering Ivan Shmakov <oneingray@gmail.com> - 2013-07-15 11:37 +0000
                Re: [OT] engineering Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-16 21:49 +0100
                Re: [OT] engineering Ivan Shmakov <oneingray@gmail.com> - 2013-07-17 09:27 +0000
                Re: [OT] engineering Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-17 15:53 +0100
                Re: [OT] engineering Ivan Shmakov <oneingray@gmail.com> - 2013-07-22 10:36 +0000
                Re: [OT] engineering Shmuel (Seymour J.) Metz <spamtrap@library.lspace.org.invalid> - 2013-07-23 06:43 -0400
                Re: [OT] engineering Ivan Shmakov <oneingray@gmail.com> - 2013-07-22 10:38 +0000
                Re: [OT] engineering Rui Maciel <rui.maciel@gmail.com> - 2013-07-26 10:09 +0100
                Re: [OT] scoping "Peter J. Holzer" <hjp-usenet3@hjp.at> - 2013-07-12 14:58 +0200
                Re: [OT] scoping Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-12 15:50 +0100
                Re: [OT] scoping Shmuel (Seymour J.) Metz <spamtrap@library.lspace.org.invalid> - 2013-07-12 13:34 -0400
                Re: [OT] scoping Ben Morrow <ben@morrow.me.uk> - 2013-07-12 22:04 +0100
                Re: [OT] scoping Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-13 13:13 +0100
                Re: [OT] scoping John Black <jblack@nospam.com> - 2013-07-13 20:01 -0500
                Re: [OT] scoping Ben Morrow <ben@morrow.me.uk> - 2013-07-14 03:24 +0100
                Re: [OT] scoping "Dr.Ruud" <rvtol+usenet@xs4all.nl> - 2013-07-14 10:49 +0200
                Re: [OT] scoping Ben Morrow <ben@morrow.me.uk> - 2013-07-14 13:13 +0100
                Re: [OT] scoping "Dr.Ruud" <rvtol+usenet@xs4all.nl> - 2013-07-14 17:02 +0200
                Re: [OT] scoping Ben Morrow <ben@morrow.me.uk> - 2013-07-14 22:21 +0100
                Re: [OT] scoping "Dr.Ruud" <rvtol+usenet@xs4all.nl> - 2013-07-15 02:21 +0200
                Re: [OT] scoping Xho Jingleheimerschmidt <xhoster@gmail.com> - 2013-07-14 17:04 -0700
                Re: [OT] scoping Ben Morrow <ben@morrow.me.uk> - 2013-07-15 14:12 +0100
                Re: [OT] scoping tmcd@panix.com (Tim McDaniel) - 2013-07-14 15:11 +0000
                Re: [OT] scoping "Dr.Ruud" <rvtol+usenet@xs4all.nl> - 2013-07-14 17:34 +0200
                Re: [OT] scoping Xho Jingleheimerschmidt <xhoster@gmail.com> - 2013-07-14 15:34 -0700
                Re: [OT] scoping Ben Morrow <ben@morrow.me.uk> - 2013-07-15 14:27 +0100
                Re: [OT] scoping John Black <jblack@nospam.com> - 2013-07-14 23:48 -0500
                Re: [OT] scoping Martijn Lievaart <m@rtij.nl.invlalid> - 2013-07-13 12:14 +0200
      Re: this should work David Harmon <source@netcom.com> - 2013-07-11 10:02 -0700
        Re: this should work Ben Morrow <ben@morrow.me.uk> - 2013-07-11 22:04 +0100
          Re: this should work David Harmon <source@netcom.com> - 2013-07-12 09:34 -0700
            Re: this should work Rainer Weikusat <rweikusat@mssgmbh.com> - 2013-07-12 18:16 +0100
        Re: this should work "Dr.Ruud" <rvtol+usenet@xs4all.nl> - 2013-07-12 15:44 +0200
          Re: this should work David Harmon <source@netcom.com> - 2013-07-12 15:53 -0700
  Re: this should work Shmuel (Seymour J.) Metz <spamtrap@library.lspace.org.invalid> - 2013-07-11 09:14 -0400
    Re: this should work "George Mpouras" <nospam.gravitalsun.antispam@spamno.hotmail.anispam.com.nospam> - 2013-07-11 19:45 +0300

csiph-web