随机文本文件Delphi源或其他任何东西

Hei*_*sis 3 delphi performance tstringlist text-files

我有一个包含10,000个条目的字符串列表.我有一个shuffle例程,但访问任何项目需要花费很多时间.浏览所有10k项目需要花费大量时间.

我想保存它做磁盘然后使用另一种方法对文件进行洗牌.

有什么建议?

Sve*_*sli 7

你的shuffle例程是如何实现的?特别是交换程序?如果你自己编写了以下内容:

vTempSrting := vStringList[I]; 
vStringList.Delete(I); 
vStringList.Insert(J,vTempString);
Run Code Online (Sandbox Code Playgroud)

它会很慢.在stringlist上使用exchange-method.

这段代码在我的平均(3岁)计算机上耗时78毫秒:

program Project1;

{$APPTYPE CONSOLE}

uses
  SysUtils,Classes,uIntegerList,Windows,Math;

procedure Shuffle(aSL : TStringList);
var I,J : integer;
begin
  for I := 0 to aSL.Count-1 do
  begin
    J := randomrange(I,aSL.Count);
    aSL.Exchange(I,J);
  end;
end;

procedure CreateTestFile;
var
  vSL : TStringList;
  I : integer;
begin
  vSL := TStringList.Create;
  try
    for I := 1 to 100000 do vSL.Add('Sample text #'+inttostr(I));
    vSL.SaveToFile('c:\test.txt');
  finally
    vSL.Free;
  end;
end;

function TestShuffle : longword;
var
  vSL : TStringList;
  vTick0 : longword;
begin
  vSL := TStringList.Create;
  try
    vTick0 := gettickcount;
    vSL.LoadFromFile('c:\test.txt');
    Shuffle(vSL);
    vSL.SaveToFile('c:\test.txt');
    Result := gettickcount - vTick0;
  finally
    vSL.Free;
  end;
end;

begin
  CreateTestFile;
  writeln(TestShuffle,' ms');
  readln;
end.
Run Code Online (Sandbox Code Playgroud)