code_junkie

Why is CharInSet faster than Case statement?

Nov 12th, 2011
84
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.59 KB | None | 0 0
  1. {$apptype console}
  2.  
  3. uses Windows, SysUtils;
  4.  
  5. const
  6. SampleString = 'foo bar baz blah de;blah de blah.';
  7.  
  8. procedure P1;
  9. var
  10. cp: PChar;
  11. begin
  12. cp := PChar(SampleString);
  13. while not CharInSet(cp^, [#0, ';', '.']) do
  14. Inc(cp);
  15. end;
  16.  
  17. procedure P2;
  18. var
  19. cp: PChar;
  20. begin
  21. cp := PChar(SampleString);
  22. while True do
  23. case cp^ of
  24. '.', #0, ';':
  25. Break;
  26. else
  27. Inc(cp);
  28. end;
  29. end;
  30.  
  31. procedure P3;
  32. var
  33. cp: PChar;
  34. begin
  35. cp := PChar(SampleString);
  36. while not (AnsiChar(cp^) in [#0, ';', '.']) do
  37. Inc(cp);
  38. end;
  39.  
  40. procedure Time(const Title: string; Proc: TProc);
  41. var
  42. i: Integer;
  43. start, finish, freq: Int64;
  44. begin
  45. QueryPerformanceCounter(start);
  46. for i := 1 to 1000000 do
  47. Proc;
  48. QueryPerformanceCounter(finish);
  49. QueryPerformanceFrequency(freq);
  50. Writeln(Format('%20s: %.3f seconds', [Title, (finish - start) / freq]));
  51. end;
  52.  
  53. begin
  54. Time('CharInSet', P1);
  55. Time('case stmt', P2);
  56. Time('set test', P3);
  57. end.
  58.  
  59. CharInSet: 0.261 seconds
  60. case stmt: 0.077 seconds
  61. set test: 0.060 seconds
  62.  
  63. procedure P1;
  64. var
  65. cp: PChar;
  66. begin
  67. cp := PChar(SampleString);
  68. while True do
  69. if CharInSet(cp^, [#0, ';', '.']) then
  70. Break
  71. else
  72. Inc(cp);
  73. end;
  74.  
  75. procedure P2;
  76. var
  77. cp: PChar;
  78. begin
  79. cp := PChar(SampleString);
  80. while True do
  81. case cp^ of
  82. '.', #0, ';':
  83. Break;
  84. else
  85. Inc(cp);
  86. end;
  87. end;
  88.  
  89. procedure P3;
  90. var
  91. cp: PChar;
  92. begin
  93. cp := PChar(SampleString);
  94. while True do
  95. if AnsiChar(cp^) in [#0, ';', '.'] then
  96. Break
  97. else
  98. Inc(cp);
  99. end;
  100.  
  101. CharInSet: 0.099 seconds
  102. case stmt: 0.043 seconds
  103. set test: 0.043 seconds
Add Comment
Please, Sign In to add comment