You are viewing a plain text version of this content. The canonical link for it is here.
Posted to modperl@perl.apache.org by Stas Bekman <sb...@stason.org> on 2000/06/05 19:20:50 UTC

[performance/benchmark] $| and multiprint

Here is the benchmark that tests two things: buffered vs unbuffered code
and multi-statement print vs single statement print styles. Here are the
code and results: 

  use Symbol;
  my $fh = gensym;
  open $fh, ">/dev/null" or die;
  use Benchmark;

  sub multi_print{
    print $fh "<HTML>";
    print $fh "<HEAD>";
    print $fh "<TITLE>";
    print $fh "Test page";
    print $fh "<TITLE>";
    print $fh "</HEAD>";
    print $fh "<BODY BGCOLOR=\"black\" TEXT=\"white\">";
    print $fh "<H1>";
    print $fh "Hello";
    print $fh "</H1>";
    print $fh "<A HREF=\"foo.html\">";
    print $fh "foo";
    print $fh "</A>";
    print $fh "</BODY>";
    print $fh "</HTML>";
  }

  sub single_print{
    print $fh qq{<HTML>
      <HEAD>
	<TITLE>Test page<TITLE>
      </HEAD>
      <BODY BGCOLOR="black" TEXT="white">
        <H1>
          Hello
        </H1>
        <A HREF="foo.html">foo</A>
      </BODY>
    </HTML>
    };
  }

  timethese
    (500_000, {
	   multi_print_unbuffered  => sub {local $| = 1; multi_print() ;},
	   multi_print_buffered    => sub {              multi_print() ;},
	   single_print_unbuffered => sub {local $| = 1; single_print();},
	   single_print_buffered   => sub {              single_print();},
	  });

Benchmark: timing 500000 iterations of multi_print_buffered,
multi_print_unbuffered, single_print_buffered, single_print_unbuffered...
multi_print_buffered: 13 wallclock secs (11.09 usr +  0.17 sys = 11.26
CPU)
multi_print_unbuffered: 18 wallclock secs (16.50 usr +  0.31 sys = 16.81
CPU)
single_print_buffered:  2 wallclock secs ( 2.83 usr +  0.06 sys =  2.89
CPU)
single_print_unbuffered:  8 wallclock secs ( 7.75 usr +  0.26 sys =  8.01
CPU)

But if I put:
  timethese
    (500_000, {
           multi_print_unbuffered  => sub {local $| = 1; multi_print() ;},
           multi_print_buffered    => sub {local $| = 0; multi_print() ;}, 
           single_print_unbuffered => sub {local $| = 1; single_print();},
           single_print_buffered   => sub {local $| = 0; single_print();},
          });

Benchmark: timing 500000 iterations of multi_print_buffered,
multi_print_unbuffered, single_print_buffered, single_print_unbuffered...
multi_print_buffered: 18 wallclock secs (15.79 usr +  0.65 sys = 16.44
CPU)
multi_print_unbuffered: 18 wallclock secs (16.57 usr +  0.37 sys = 16.94
CPU)
single_print_buffered:  7 wallclock secs ( 7.23 usr +  0.12 sys =  7.35
CPU)
single_print_unbuffered:  9 wallclock secs ( 7.57 usr +  0.32 sys =  7.89
CPU)

There is no difference between buffered and not buffered, it seems that
the localizing of $| is what makes the difference. The multi vs single
still holds.

But you don't modify $| unless you want to unbuffer, so the first test
seems to be fair to me. What do you think?

Do you think I should test it under Apache (thru ab) since it might behave
differently under Apache? But I doubt I'd be able to measure this unless
the text would be huge to get the real feel of the numbers. You saw that
I'd to run 500_000 tests to get some real numbers...

_____________________________________________________________________
Stas Bekman              JAm_pH     --   Just Another mod_perl Hacker
http://stason.org/       mod_perl Guide  http://perl.apache.org/guide 
mailto:stas@stason.org   http://perl.org     http://stason.org/TULARC
http://singlesheaven.com http://perlmonth.com http://sourcegarden.org


Re: [performance/benchmark] $| and multiprint

Posted by Tim Bunce <Ti...@ig.co.uk>.
Your benchmarks with $| unset aren't addressing flushing. 
The flush may be happening after the benchmark has finished.
I suspect (without looking at the source) that when $| is unlocalized,
in the last set of results, that may be triggering a flush.

Also, the two outputs are not the same. One has newlines.
Finally, you should also consider the

	print $fh "...", "...", "..." ...

case.

Tim.

On Mon, Jun 05, 2000 at 08:20:50PM +0300, Stas Bekman wrote:
> 
> Here is the benchmark that tests two things: buffered vs unbuffered code
> and multi-statement print vs single statement print styles. Here are the
> code and results: 
> 
>   use Symbol;
>   my $fh = gensym;
>   open $fh, ">/dev/null" or die;
>   use Benchmark;
> 
>   sub multi_print{
>     print $fh "<HTML>";
>     print $fh "<HEAD>";
>     print $fh "<TITLE>";
>     print $fh "Test page";
>     print $fh "<TITLE>";
>     print $fh "</HEAD>";
>     print $fh "<BODY BGCOLOR=\"black\" TEXT=\"white\">";
>     print $fh "<H1>";
>     print $fh "Hello";
>     print $fh "</H1>";
>     print $fh "<A HREF=\"foo.html\">";
>     print $fh "foo";
>     print $fh "</A>";
>     print $fh "</BODY>";
>     print $fh "</HTML>";
>   }
> 
>   sub single_print{
>     print $fh qq{<HTML>
>       <HEAD>
> 	<TITLE>Test page<TITLE>
>       </HEAD>
>       <BODY BGCOLOR="black" TEXT="white">
>         <H1>
>           Hello
>         </H1>
>         <A HREF="foo.html">foo</A>
>       </BODY>
>     </HTML>
>     };
>   }
> 
>   timethese
>     (500_000, {
> 	   multi_print_unbuffered  => sub {local $| = 1; multi_print() ;},
> 	   multi_print_buffered    => sub {              multi_print() ;},
> 	   single_print_unbuffered => sub {local $| = 1; single_print();},
> 	   single_print_buffered   => sub {              single_print();},
> 	  });
> 
> Benchmark: timing 500000 iterations of multi_print_buffered,
> multi_print_unbuffered, single_print_buffered, single_print_unbuffered...
> multi_print_buffered: 13 wallclock secs (11.09 usr +  0.17 sys = 11.26
> CPU)
> multi_print_unbuffered: 18 wallclock secs (16.50 usr +  0.31 sys = 16.81
> CPU)
> single_print_buffered:  2 wallclock secs ( 2.83 usr +  0.06 sys =  2.89
> CPU)
> single_print_unbuffered:  8 wallclock secs ( 7.75 usr +  0.26 sys =  8.01
> CPU)
> 
> But if I put:
>   timethese
>     (500_000, {
>            multi_print_unbuffered  => sub {local $| = 1; multi_print() ;},
>            multi_print_buffered    => sub {local $| = 0; multi_print() ;}, 
>            single_print_unbuffered => sub {local $| = 1; single_print();},
>            single_print_buffered   => sub {local $| = 0; single_print();},
>           });
> 
> Benchmark: timing 500000 iterations of multi_print_buffered,
> multi_print_unbuffered, single_print_buffered, single_print_unbuffered...
> multi_print_buffered: 18 wallclock secs (15.79 usr +  0.65 sys = 16.44
> CPU)
> multi_print_unbuffered: 18 wallclock secs (16.57 usr +  0.37 sys = 16.94
> CPU)
> single_print_buffered:  7 wallclock secs ( 7.23 usr +  0.12 sys =  7.35
> CPU)
> single_print_unbuffered:  9 wallclock secs ( 7.57 usr +  0.32 sys =  7.89
> CPU)
> 
> There is no difference between buffered and not buffered, it seems that
> the localizing of $| is what makes the difference. The multi vs single
> still holds.
> 
> But you don't modify $| unless you want to unbuffer, so the first test
> seems to be fair to me. What do you think?
> 
> Do you think I should test it under Apache (thru ab) since it might behave
> differently under Apache? But I doubt I'd be able to measure this unless
> the text would be huge to get the real feel of the numbers. You saw that
> I'd to run 500_000 tests to get some real numbers...
> 
> _____________________________________________________________________
> Stas Bekman              JAm_pH     --   Just Another mod_perl Hacker
> http://stason.org/       mod_perl Guide  http://perl.apache.org/guide 
> mailto:stas@stason.org   http://perl.org     http://stason.org/TULARC
> http://singlesheaven.com http://perlmonth.com http://sourcegarden.org