Guest User

Untitled

a guest
Aug 21st, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.14 KB | None | 0 0
  1. Why do these 2 RegEx benchmarks differ so much?
  2. # Benchmark
  3. use Benchmark qw(:all);
  4.  
  5. my $count = 10000000;
  6. my $re = qr/abc/o;
  7. my %tests = (
  8. "NOFIND " => "cvxcvidgds.sdfpkisd[s"
  9. ,"FIND_AT_END " => "cvxcvidgds.sdfpabcd[s"
  10. ,"FIND_AT_START " => "abccvidgds.sdfpkisd[s"
  11. );
  12.  
  13. foreach my $type (keys %tests) {
  14. my $str = $tests{$type};
  15. cmpthese($count, {
  16. "rege1.$type" => sub { my $idx = ($str =~ $re); },
  17. "rege2.$type" => sub { my $idx = ($str =~ /abc/o); }
  18. });
  19. }
  20.  
  21. # Benchmark
  22. use Benchmark qw(:all);
  23.  
  24. my $count = 10000000;
  25. my $re = qr/abc/o;
  26. my %tests = (
  27. "NOFIND " => "cvxcvidgds.sdfpkisd[s"
  28. ,"FIND_AT_END " => "cvxcvidgds.sdfpabcd[s"
  29. ,"FIND_AT_START " => "abccvidgds.sdfpkisd[s"
  30. );
  31.  
  32. foreach my $type (keys %tests) {
  33. my $str = $tests{$type};
  34. cmpthese($count, {
  35. "rege1.$type" => sub { my $idx = ($str =~ $re); },
  36. "rege2.$type" => sub { my $idx = ($str =~ /abc/o); }
  37. });
  38. }
  39.  
  40. use Benchmark 'cmpthese';
  41.  
  42. my $re = qr/abc/o;
  43. my %tests = (
  44. 'fail ' => 'cvxcvidgds.sdfpkisd[s',
  45. 'end ' => 'cvxcvidgds.sdfpabcd[s',
  46. 'start' => 'abccvidgds.sdfpkisd[s',
  47. );
  48.  
  49. for my $mag (map 10**$_, 1 .. 5) {
  50. say "n$mag:";
  51. for my $type (keys %tests) {
  52. my $str = $tests{$type};
  53. cmpthese -1, {
  54. '$re '.$type => sub {my $i; $i = ($str =~ $re ) for 0 .. $mag},
  55. '/abc/o '.$type => sub {my $i; $i = ($str =~ /abc/o) for 0 .. $mag},
  56. '/$re/ '.$type => sub {my $i; $i = ($str =~ /$re/ ) for 0 .. $mag},
  57. '/$re/o '.$type => sub {my $i; $i = ($str =~ /$re/o) for 0 .. $mag},
  58. }
  59. }
  60. }
  61.  
  62. /.../o
  63.  
  64. 1/661157 s - 1/4384042 s = 0.000,001,3 s
  65. 1/678702 s - 1/5117707 s = 0.000,001,3 s
  66. 1/657765 s - 1/4268032 s = 0.000,001,3 s
  67.  
  68. >perl -MO=Concise,-exec -e"$x =~ /abc/"
  69. 1 <0> enter
  70. 2 <;> nextstate(main 1 -e:1) v:{
  71. 3 <#> gvsv[*x] s
  72. 4 </> match(/"abc"/) vKS/RTIME
  73. 5 <@> leave[1 ref] vKP/REFC
  74. -e syntax OK
  75.  
  76. >perl -MO=Concise,-exec -e"$x =~ $re"
  77. 1 <0> enter
  78. 2 <;> nextstate(main 1 -e:1) v:{
  79. 3 <#> gvsv[*x] s
  80. 4 <1> regcreset sK/1
  81. 5 <#> gvsv[*re] s
  82. 6 <|> regcomp(other->7) sK/1
  83. 7 </> match() vKS/RTIME
  84. 8 <@> leave[1 ref] vKP/REFC
  85. -e syntax OK
Add Comment
Please, Sign In to add comment