Advertisement
Guest User

Untitled

a guest
Jul 19th, 2019
100
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.36 KB | None | 0 0
  1. procedure TfrmTester.btnClassicClick(Sender: TObject);
  2. VAR
  3. s: string;
  4. FileBody: string;
  5. c: Cardinal;
  6. i: Integer;
  7. begin
  8. FileBody:= ReadFile(File4MB);
  9. c:= GetTickCount;
  10.  
  11. for i:= 1 to Length(FileBody) DO
  12. s:= s+ FileBody[i];
  13.  
  14. Log.Lines.Add('Time: '+ IntToStr(GetTickCount-c) + 'ms'); // 8502 ms
  15. end;
  16.  
  17. Time:
  18. BuffSize= 10000; // 10k buffer = 406ms
  19. BuffSize= 100000; // 100k buffer = 140ms
  20. BuffSize= 1000000; // 1M buffer = 46ms
  21.  
  22. procedure TfrmTester.btnBufferedClick(Sender: TObject);
  23. VAR
  24. s: string;
  25. FileBody: string;
  26. c: Cardinal;
  27. CurBuffLen, marker, i: Integer;
  28. begin
  29. FileBody:= ReadFile(File4MB);
  30. c:= GetTickCount;
  31.  
  32. marker:= 1;
  33. CurBuffLen:= 0;
  34. for i:= 1 to Length(FileBody) DO
  35. begin
  36. if i > CurBuffLen then
  37. begin
  38. SetLength(s, CurBuffLen+ BuffSize);
  39. CurBuffLen:= Length(s)
  40. end;
  41. s[marker]:= FileBody[i];
  42. Inc(marker);
  43. end;
  44.  
  45. SetLength(s, marker-1); { Cut down the prealocated buffer that we haven't used }
  46.  
  47. Log.Lines.Add('Time: '+ IntToStr(GetTickCount-c) + 'ms');
  48. if s <> FileBody
  49. then Log.Lines.Add('FAILED!');
  50. end;
  51.  
  52. Time:
  53. BuffSize= 10000; // 10k buffer = 437ms
  54. BuffSize= 100000; // 100k buffer = 187ms
  55. BuffSize= 1000000; // 1M buffer = 78ms
  56.  
  57. procedure TfrmTester.btnBuffClassClick(Sender: TObject);
  58. VAR
  59. StringBuff: TCStringBuff;
  60. s: string;
  61. FileBody: string;
  62. c: Cardinal;
  63. i: Integer;
  64. begin
  65. FileBody:= ReadFile(File4MB);
  66. c:= GetTickCount;
  67.  
  68. StringBuff:= TCStringBuff.Create(BuffSize);
  69. TRY
  70. for i:= 1 to Length(FileBody) DO
  71. StringBuff.AddChar(filebody[i]);
  72. s:= StringBuff.GetResult;
  73. FINALLY
  74. FreeAndNil(StringBuff);
  75. END;
  76.  
  77. Log.Lines.Add('Time: '+ IntToStr(GetTickCount-c) + 'ms');
  78. if s <> FileBody
  79. then Log.Lines.Add('FAILED!');
  80. end;
  81.  
  82. { TCStringBuff }
  83.  
  84. constructor TCStringBuff.Create(aBuffSize: Integer= 10000);
  85. begin
  86. BuffSize:= aBuffSize;
  87. marker:= 1;
  88. CurBuffLen:= 0;
  89. inp:= 1;
  90. end;
  91.  
  92.  
  93. function TCStringBuff.GetResult: string;
  94. begin
  95. SetLength(s, marker-1); { Cut down the prealocated buffer that we haven't used }
  96. Result:= s;
  97. s:= ''; { Free memory }
  98. end;
  99.  
  100.  
  101. procedure TCStringBuff.AddChar(Ch: Char);
  102. begin
  103. if inp > CurBuffLen then
  104. begin
  105. SetLength(s, CurBuffLen+ BuffSize);
  106. CurBuffLen:= Length(s)
  107. end;
  108.  
  109. s[marker]:= Ch;
  110. Inc(marker);
  111. Inc(inp);
  112. end;
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement