in reply to Re^6: Substituting Newline Characters
in thread Substituting Newline Characters

I was suprised by the performance hit. In essence the only change was 2x if/else cases added

sub merge { my ( $data, $unmerge ) = @_; while ( $some_condition ) { # big loop, no embedded loops $count = $unmerge ? $count1 + $count2 : $count1 - $count 2; } }

As you say a preprocessor of some description could optimise the flag away, depending on the call. eval might well have allowed perl to optimise the code getting rid of the repeated if checks that will either always be true or always be false. But by the time I had added an AUTOLOAD the code would have been a lot less transparent and physically almost as long. I had not thought about using eval to delay compilation and effectively allow you to stub the functions and get them to compile more efficiently. I may give it a benchmark when I have a chance.

cheers

tachyon

Replies are listed 'Best First'.
Re^8: Substituting Newline Characters
by Aristotle (Chancellor) on Mar 16, 2004 at 16:11 UTC
    No no, I mean eval to generate two near-identical subs at compile time — no AUTOLOAD funkiness or anything.
    BEGIN { my $merge_code = <<'EOC'; sub %s { my ($data) = @_; while ( $some_condition ) { # big loop, no embedded loops $count = $count1 %s $count2; } } EOC eval sprintf $merge_code, merge => '+'; eval sprintf $merge_code, unmerge => '-'; }
    I think it's very clear what's going on here, and you still get the benefit of only maintaining a single copy of the code.

    Makeshifts last the longest.