teststr.pp 5.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235
  1. { $OPT=-Fu../rtl/utils
  2. $Id$
  3. Program to test string functions and speed of the functions
  4. }
  5. program TestStr;
  6. uses Timer;
  7. const
  8. TestSize=10; {Use at least 10 for reasonable results}
  9. type
  10. BenType=array[1..8] of longint;
  11. var
  12. Total : longint;
  13. headBen,
  14. LoadBen,
  15. ConcatBen,
  16. DelBen,
  17. InsBen,
  18. CopyBen,
  19. CmpBen,
  20. MixBen : BenType;
  21. t : TTimer;
  22. function TestOK:boolean;
  23. Const
  24. TestStr: string[22]='HELLO, THIS IS A TEST ';
  25. var
  26. I : INTEGER;
  27. U : STRING[1];
  28. Q : STRING[100];
  29. S : STRING[55];
  30. T : STRING[60];
  31. V : STRING;
  32. begin
  33. TestOk:=false;
  34. T:='THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 1234567890';
  35. Insert (T, T, 1);
  36. {Writeln(T);}
  37. Delete (T, 55, 54);
  38. S:=Copy (T, -5, 2); {'TH'}
  39. U:=Copy (T, 7, 4); {'I'}
  40. S:=S + U; {'THI'}
  41. Q:=Copy (T, 32, 70); {'THE LAZY DOG 1234567890'}
  42. Delete (Q, 2, 1); {'TE LAZY DOG 1234567890'}
  43. Delete (Q, 100, 2); {'TE LAZY DOG 1234567890'}
  44. Delete (Q, 3, -4); {'TE LAZY DOG 1234567890'}
  45. Delete (Q, 3, 10); {'TE1234567890'}
  46. { writeln('TE1234567890 - ',Q);}
  47. I:=Pos ('S', T); {25}
  48. Insert(Copy(T,I,200),Q,3);{'TES OVER THE LAZY DOG 12345678901234567890'}
  49. Delete (Q, 4, 6); {'TESTHE LAZY DOG 12345678901234567890}
  50. S:=S + T [25]; {'THIS'}
  51. S:=S + Copy (S, 3, -5) + Copy (S, 3, 2); {'THISIS'}
  52. V:=T; {'THE QUICK BROWN FOX JUMPS OVER THE LAZY ..'}
  53. Delete (V, -10, 47); {'AZY DOG 1234567890'}
  54. if (Copy (V, -7, -1)='') and (Pos ('DOG', V)=5) then {TRUE}
  55. Insert (V, S, 200); {'THISISAZY DOG 1234567890'}
  56. U:=Copy (T, 44, 40); {' '}
  57. Insert (U, S, 5); {'THIS ISAZY DOG 1234567890'}
  58. I:=Pos ('ZY', S); {9}
  59. Delete (S, I, -5); {'THIS ISAZY DOG 1234567890'}
  60. Insert (Copy(S,5,1),S,8); {'THIS IS AZY DOG 1234567890'}
  61. Delete (S, 10, 16); {'THIS IS A0'}
  62. if S [Length (S)]='0' then {TRUE}
  63. S:=S + Q; {'THIS IS A0TESTHE LAZY DOG 123456789012345...'}
  64. V:=Copy (S, Length (S) - 19, 10); {'1234567890'}
  65. if V=Copy (S, Length (S) - 9, 10) then {TRUE}
  66. Delete (S, 15, 3 * Length (V)+2); {'THIS IS A0TEST'}
  67. Insert ('', S, 0); {'THIS IS A0TEST'}
  68. Insert(Copy(S,5,1),S,11); {'THIS IS A0 TEST'}
  69. Insert ('HELLO', S, -4); {'HELLOTHIS IS A0 TEST'}
  70. Insert (',', S, 6); {'HELLO,THIS IS A0 TEST'}
  71. Delete (S, Pos ('TEST', S) - 2, 1); {'HELLO,THIS IS A TEST'}
  72. Delete (Q, 0, 32767); {''}
  73. Q:=Q + ' '; {' '}
  74. Insert (Q, S, 7); {'HELLO, THIS IS A TEST'}
  75. Insert (Q, S, 255); {'HELLO, THIS IS A TEST '}
  76. if (S=TestStr) and (Q=' ') and (V='1234567890') and
  77. (T='THE QUICK BROWN FOX JUMPS OVER THE LAZY DOG 1234567890') then
  78. TestOK:=true;
  79. end;
  80. procedure TestSpeed(Row,Len:byte);
  81. var
  82. l : longint;
  83. hstr,
  84. OrgStr : string;
  85. begin
  86. HeadBen[Row]:=Len;
  87. OrgStr:='';
  88. while Length(OrgStr)<Len do
  89. OrgStr:=OrgStr+'aaaaaaaaaa';
  90. OrgStr:=Copy(OrgStr,1,Len);
  91. OrgStr[Len]:='b';
  92. {Load/Store}
  93. t.Reset;
  94. t.Start;
  95. for l:=1to 5000*TestSize do
  96. HSTr:=OrgStr;
  97. t.Stop;
  98. inc(Total,t.MSec);
  99. LoadBen[Row]:=t.MSec;
  100. {Concat}
  101. t.Reset;
  102. t.Start;
  103. for l:=1to 2000*TestSize do
  104. begin
  105. Hstr:='aaa';
  106. Hstr:=Hstr+OrgStr;
  107. end;
  108. t.Stop;
  109. inc(Total,t.MSec);
  110. ConcatBen[Row]:=t.MSec;
  111. {Copy}
  112. t.Reset;
  113. t.Start;
  114. for l:=1to 2000*TestSize do
  115. HSTr:=Copy(OrgStr,1,Len);
  116. t.Stop;
  117. inc(Total,t.MSec);
  118. CopyBen[Row]:=t.MSec;
  119. {Delete}
  120. t.Reset;
  121. t.Start;
  122. for l:=1to 2000*TestSize do
  123. begin
  124. Hstr:=OrgStr;
  125. Delete(HStr,1,9);
  126. end;
  127. t.Stop;
  128. inc(Total,t.MSec);
  129. DelBen[Row]:=t.MSec;
  130. {Insert}
  131. t.Reset;
  132. t.Start;
  133. for l:=1to 1000*TestSize do
  134. begin
  135. Hstr:='aaa';
  136. Insert(OrgStr,hstr,2);
  137. Hstr:=OrgStr;
  138. Insert('aaaaaaaaaaaaa',hstr,9);
  139. end;
  140. t.Stop;
  141. inc(Total,t.MSec);
  142. InsBen[Row]:=t.MSec;
  143. {Compare}
  144. t.Reset;
  145. t.Start;
  146. Hstr:='aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'+
  147. 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa'+
  148. 'aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa';
  149. for l:=1to 5000*TestSize do
  150. if OrgStr=Hstr then;
  151. t.Stop;
  152. inc(Total,t.MSec);
  153. CmpBen[Row]:=t.MSec;
  154. {Mixed}
  155. t.Reset;
  156. t.Start;
  157. for l:=1 to 400*TestSize do
  158. begin
  159. hstr:=OrgStr;
  160. hstr:=Copy(hstr,1,30);
  161. Delete(hstr,5,40);
  162. hstr:=Copy(hstr,1,length(hstr));
  163. hstr:=hstr+' ';
  164. Delete(hstr,length(hstr)-2,2);
  165. Insert('aaaaaaaaaaaaaaaaaaaaaaaaaaaa',hstr,10);
  166. Insert('aaaaaaaaaaaaaaaaaaaaaaaaaaaa',hstr,20);
  167. hstr:=Copy(hstr,1,length(hstr));
  168. hstr:=Copy(hstr,1,80)+'aaaaaaaaaaaaaaaaaaaaaaaaaaabbbbbbbbbbbbbbbbbbbbbbb';
  169. hstr:=hstr+OrgStr;
  170. end;
  171. t.Stop;
  172. inc(Total,t.MSec);
  173. MixBen[Row]:=t.MSec;
  174. end;
  175. procedure PutBen(const r:BenType);
  176. var
  177. i : byte;
  178. begin
  179. for i:=1to 8 do
  180. Write(r[i]:6);
  181. Writeln;
  182. end;
  183. begin
  184. t.Init;
  185. WriteLn ('String Function Compatibility and Speed Test');
  186. WriteLn;
  187. if TestOK then
  188. WriteLn('Test OK')
  189. else
  190. WriteLn('Test Failure!');
  191. if paramstr(1)='t' then
  192. halt;
  193. WriteLn;
  194. TestSpeed(1,10);
  195. TestSpeed(2,30);
  196. TestSpeed(3,50);
  197. TestSpeed(4,70);
  198. TestSpeed(5,100);
  199. TestSpeed(6,150);
  200. TestSpeed(7,200);
  201. TestSpeed(8,250);
  202. Write('Length ');
  203. PutBen(HeadBen);
  204. WriteLn('------------------------------------------------------------------------------');
  205. Write('Load/Store ');
  206. PutBen(LoadBen);
  207. Write('Concat ');
  208. PutBen(ConcatBen);
  209. Write('Copy ');
  210. PutBen(CopyBen);
  211. Write('Delete ');
  212. PutBen(DelBen);
  213. Write('Insert ');
  214. PutBen(InsBen);
  215. Write('Compare ');
  216. PutBen(CmpBen);
  217. Write('Mixed ');
  218. PutBen(MixBen);
  219. WriteLn('String-Benchmark avarage ',Total div 8,' ms');
  220. end.