tstring1.pp 6.0 KB

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