While normally I greatly respect your insight, appreciate your input, and value your code, in this case I feel I have to point out that sathishselvam doesn't seem to want to replace any "!" occuring in the first 50k bytes of the input string, but rather he wants to replace the first 50k occurances of "!". davido seems to agree with me on this one.
| [reply] |
Looking again I see you're right.
But still, rather than invoking the regex engine 50,000 times, better to search for the position of the 50,000th ! and then replace in one pass.
#! perl -slw
use strict;
use Time::HiRes qw[ time ];
my $s = '1234!' x 55e3;
my $start = time;
my( $p, $c ) = ( 0, 50e3 );
1 while --$c and $p = 1+ index $s, '!', $p;
substr( $s, 0, $p ) =~ tr[!][\n];
printf "Took %f seconds\n", time() - $start;
__END__
C:\test>junk71;;
Took 0.011771 seconds
C:\test>junk71;;
Took 0.009690 seconds
That could probably be sped up with a binary chop for the position, but it hardly seems worth it.
With the rise and rise of 'Social' network sites: 'Computers are making people easier to use everyday'
Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
| [reply] [d/l] |
For what it's worth, depending on how I measure, this is at least ten times faster than my solution. In real life it would be quite a bit more than 10x the speed of my solution -- I just used Benchmark to test, and that required making a copy of the input string on each test iteration so as not to mess with the original. Since the OP wouldn't be making copies (hopefully), that could be factored out, and would make the difference between our two algorithms all the more significant.
| [reply] |
| [reply] [d/l] |