線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1282
推到 Plurk!
推到 Facebook!

如何提高TStringList的乱序速度

尚未結案
power2010
一般會員


發表:10
回覆:11
積分:4
註冊:2004-11-11

發送簡訊給我
#1 引用回覆 回覆 發表時間:2005-05-20 15:29:16 IP:221.13.xxx.xxx 未訂閱
MEMO1中我放了35万行数据,想对其乱序排列,使用如下代码 Memo1.Lines.BeginUpdate; for i:=0 to Memo1.Lines.Count-1 do begin Memo1.Lines.Move(i,Random(Memo1.Lines.count-1)); Application.ProcessMessages; end; Memo1.Lines.endUpdate; 非常非常的慢哟,不知如何改善排列速度?望各位高人指点一二
change.jian
版主


發表:29
回覆:620
積分:439
註冊:2003-06-02

發送簡訊給我
#2 引用回覆 回覆 發表時間:2005-05-20 17:15:35 IP:61.218.xxx.xxx 未訂閱
參考這裡 http://delphi.ktop.com.tw/topic.php?topic_id=59601 另外,建議呼叫Application.ProcessMessage的次數可以減少一些,可以加快速度 發表人 - change.jian 於 2005/05/20 17:24:20
jest0024
高階會員


發表:11
回覆:310
積分:224
註冊:2002-11-24

發送簡訊給我
#3 引用回覆 回覆 發表時間:2005-05-20 19:47:51 IP:211.74.xxx.xxx 未訂閱
將字串改為指標,可提高不少的速度!!但相對的,自己要處理顯示方面的訊息
procedure TForm1.Button1Click(Sender: TObject);
var
  i,d:Integer;
  p:PString;
begin
  D:=TimeGetTime;
  ListBox1.Items.BeginUpdate;
  ListBox1.Items.Clear;
  for i:=0 to 350000 do begin
    New(p);
    p^:=IntToStr(I);
    ListBox1.Items.AddObject('',TObject(p));
  end;
  ListBox1.Items.EndUpdate;
  Caption:=IntToStr(TimeGetTime-d);
end;    procedure TForm1.Button2Click(Sender: TObject);
var
  i,j,d:Integer;
  p    :TObject;
begin
  d:=TimeGetTime;
  ListBox1.Items.BeginUpdate;
  for i:=0 to ListBox1.Items.Count-1 do begin
    j:=Random(ListBox1.Items.Count-1);
    p:=ListBox1.Items.Objects[i];
    ListBox1.Items.Objects[i]:=ListBox1.Items.Objects[j];
    ListBox1.Items.Objects[j]:=p;
  end;
  ListBox1.Items.EndUpdate;
  Caption:=IntToStr(TimeGetTime-d);
end;    procedure TForm1.ListBox1DrawItem(Control: TWinControl; Index: Integer;
  Rect: TRect; State: TOwnerDrawState);
var
  p:PString;
begin
  p:=PString(ListBox1.Items.Objects[Index]);
  if p<>nil then begin
    ListBox1.Canvas.FillRect(Rect);
    ListBox1.Canvas.TextOut(Rect.Left 2,Rect.Top 2,p^);
  end;
end;    
發表人 - jest0024 於 2005/05/20 19:49:26
wameng
版主


發表:31
回覆:1336
積分:1188
註冊:2004-09-16

發送簡訊給我
#4 引用回覆 回覆 發表時間:2005-05-20 23:20:40 IP:219.86.xxx.xxx 未訂閱
事實上,沒有必要搞的那麼偏。 建議將精力放在亂數排序及其他的解決方法。 例如: 1.Memo1.Lines.Move(i,Random(Memo1.Lines.count-1)); 將來源搬移到目的,相對的目的應該可以不需要在做。 那麼使用的時間至少減少一半。 可以找一下這方面資料,有些書籍會寫得比較詳細。 2.不要使用Application.ProcessMessages 使用 Application.ProcessMessages 倒不如直接 Memo1.Repaint; 而且你使用了BeginUpdate 已將其 Lock 基本上就已經不會刷新 Memo1 。把他刪掉直接一點。 參考 ~~~~~~~~~~~ 難得聰明,常常糊塗。 ~~~~~~~~~~~
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#5 引用回覆 回覆 發表時間:2005-05-22 09:47:05 IP:203.204.xxx.xxx 未訂閱
不要用 Move, 可能會動到很多行, 直接將兩行做交換    
    for i:=0 to Memo1.Lines.Count-1 do
begin
  temp:=Memo1.Lines[Random(Memo1.Lines.count-1)];
  Memo1.Lines[Random(Memo1.Lines.count-1)] := Memo1.Lines[i];
  Memo1.Lines[i] := temp; 
end;    
********************* 如果您滿意答案,請結案 *********************
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
系統時間:2024-06-01 15:29:55
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!