teststr.pp 6.1 KB

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