At 1:44 PM +0100 12/19/03, Hans de Groot wrote:
>if I make a silly script like this:

Just so you know, that while is *real* inefficient.  What you really want is something 
like:
        s/foo.jpg/++$counter . ".jpg"/ge

See the below results.  I did them in 1 iteration and 10 separately because the while 
version was too slow for me to wait for the results if I tried it 10 times.

Benchmark: timing 1 iterations of per-line g, slurp g, while data, while inline...
per-line g:  0 wallclock secs ( 0.14 usr +  0.00 sys =  0.14 CPU) @  7.14/s (n=1)
            (warning: too few iterations for a reliable count)
   slurp g:  0 wallclock secs ( 0.06 usr +  0.00 sys =  0.06 CPU) @ 16.67/s (n=1)
            (warning: too few iterations for a reliable count)
while data: 44 wallclock secs (35.37 usr +  0.00 sys = 35.37 CPU) @  0.03/s (n=1)
            (warning: too few iterations for a reliable count)
while inline: 44 wallclock secs (35.20 usr +  0.00 sys = 35.20 CPU) @  0.03/s (n=1)
            (warning: too few iterations for a reliable count)
               s/iter   while data while inline   per-line g      slurp g
while data       35.4           --          -0%        -100%        -100%
while inline     35.2           0%           --        -100%        -100%
per-line g      0.140       25164%       25043%           --         -57%
slurp g      6.00e-02       58850%       58567%         133%           --

at 10 iterations (with the slow two turned off)

Benchmark: timing 10 iterations of per-line g, slurp g, while data, while inline...
per-line g:  2 wallclock secs ( 1.41 usr +  0.00 sys =  1.41 CPU) @  7.09/s (n=10)
   slurp g:  1 wallclock secs ( 0.64 usr +  0.00 sys =  0.64 CPU) @ 15.62/s (n=10)
while data:  0 wallclock secs ( 0.00 usr +  0.00 sys =  0.00 CPU)
            (warning: too few iterations for a reliable count)
while inline:  0 wallclock secs ( 0.00 usr +  0.00 sys =  0.00 CPU)
            (warning: too few iterations for a reliable count)
                            Rate          per-line g            slurp g while data 
while inline
per-line g                7.09/s                  --               -55%      -100%     
   -100%
slurp g                   15.6/s                120%                 --      -100%     
   -100%
while data   10000000000000000/s 141000000000000000% 64000000000000016%         --     
      0%
while inline 10000000000000000/s 141000000000000000% 64000000000000016%         0%     
      --


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

use Benchmark qw(cmpthese);

cmpthese($ARGV[0] || 10, {
        'while data'    => q{
                        return if ($ARGV[0] > 1);       # too slow
                        #print STDERR "while data: ";
                        my ($data, $counter);
                        $data = '';
                        open(T, "</etc/magic");
                        while (<T>) {
                            $data .= $_;
                        }
                        close(T);
                        $counter = 0;
                        while ($data =~ s/e/$counter/) { ++$counter; }
                        #print STDERR "$counter\n";
                    },
        'while inline'  => q{
                        return if ($ARGV[0] > 1);       # too slow
                        #print STDERR "while inline: ";
                        my ($data, $counter);
                        $counter = 0;
                        open(T, "</etc/magic");
                        while (<T>) {
                            while (s/e/$counter/) { ++$counter; }
                        }
                        close(T);
                        #print STDERR "$counter\n";
                    },
        'per-line g'    => q{
                        #print STDERR "per-line g: ";
                        my ($data, $counter);
                        $counter = 0;
                        open(T, "</etc/magic");
                        while (<T>) {
                            s/e/++$counter/ge;
                        }
                        close(T);
                        #print STDERR "$counter\n";
                    },
        'slurp g'       => q{
                        #print STDERR "slurp g: ";
                        my ($data, $counter);
                        $counter = 0;
                        open(T, "</etc/magic");
                        select((select(T), $/ = undef)[0]);     # no eol
                        $data = <T>;
                        close(T);
                        $data =~ s/e/++$counter/ge;
                        #print STDERR "$counter\n";
                    },
        });

-- 
Kee Hinckley
http://www.messagefire.com/         Next Generation Spam Defense
http://commons.somewhere.com/buzz/  Writings on Technology and Society

I'm not sure which upsets me more: that people are so unwilling to accept
responsibility for their own actions, or that they are so eager to regulate
everyone else's.

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to