in reply to Re^3: Remove all non alphanumeric characters excluding space, underscore and minus sign (Benchmark--)
in thread Remove all non alphanumeric characters excluding space, underscore and minus sign

There's still another "tiny mistake" with your code, which is that the following snippet doesn't generate a string of length 1024001, but a string of length 1:

my $string = pack "A*" => map { chr (32 + int rand 95) } 0..1024000; print length($string);

Done properly, i.e. either using pack "(A)*", ..., or join '', ..., or the much more memory-friendly

my $string; $string .= chr(32 + int rand 95) for 0..1024000;

I get the following quite different results:

Rate subsingle subplus tran subsingle 18.5/s -- -15% -93% subplus 21.9/s 18% -- -92% tran 268/s 1345% 1121% --
  • Comment on Re^4: Remove all non alphanumeric characters excluding space, underscore and minus sign (Benchmark--)
  • Select or Download Code

Replies are listed 'Best First'.
Re^5: Remove all non alphanumeric characters excluding space, underscore and minus sign (Benchmark--)
by tye (Sage) on Feb 13, 2012 at 20:01 UTC

    Thanks. I was short on time and posted with code I wouldn't use myself because it seemed to demonstrate the problem with the prior code. When I use Benchmark myself, I arrange for a way to test the code being benchmarked for exactly these types of reasons.

    I was fooled by seeing a 200% difference but I still should've rejected the code when the run time per operation was that low.

    Sorry for posting "in a hurry". Thanks for the correction. :)

    - tye        

      I so much stand corrected! When I wrote it, I meant

      my $string = pack "C*" => map { 32 + int rand 95 } 0..1280; cmpthese (-1, { subsingle => sub { (my $s = $string) =~ s/[^a-zA-Z0-9 _-]//g }, subplus => sub { (my $s = $string) =~ s/[^a-zA-Z0-9 _-]+//g }, tran => sub { (my $s = $string) =~ tr/a-zA-Z0-9 _-//cd }, });

      Which gives completely different results indeed:

      $ perl5.8.8 test.pl Rate subsingle subplus tran subsingle 9514/s -- -2% -90% subplus 9660/s 2% -- -90% tran 92839/s 876% 861% -- $ perl5.10.1 test.pl Rate subsingle subplus tran subsingle 7802/s -- -9% -92% subplus 8574/s 10% -- -91% tran 99211/s 1172% 1057% -- $ perl5.12.3 test.pl Rate subsingle subplus tran subsingle 5191/s -- -17% -95% subplus 6279/s 21% -- -94% tran 99211/s 1811% 1480% -- $ perl5.14.1 test.pl Rate subsingle subplus tran subsingle 6081/s -- -18% -94% subplus 7450/s 23% -- -92% tran 97303/s 1500% 1206% -- $ bleadperl test.pl Rate subsingle subplus tran subsingle 6221/s -- -12% -94% subplus 7096/s 14% -- -93% tran 97303/s 1464% 1271% -- $

      So the plus indeed speeds up the substitute and tr, even in /c mode, is fastest


      Enjoy, Have FUN! H.Merijn