喫茶XRAYトップページ

[スレッド全体
]

[7276] StringList ソートの速さ比べ返信 削除
2014/2/28 (金) 16:57:19 taki
StringListに逐次データが追加される場合、追加の度にsortメソッドを実行するより
最初から Sorted := true; にする方が断然速いようです。

※私のPCの環境では…

// 追加後Sort  1,267ms 1,000回 (※10,000回だとなかなか帰ってこない)
  for i := 1 to 1000 do begin
    sl.Append(FormatCurr('000000',Random(1000000)));
    sl.Sort;
  end;

// 初めからTrue 77ms 10,000回
  sl.Sorted := true;
  for i := 1 to 10000 do begin
    sl.Append(FormatCurr('000000',Random(1000000)));
  end;

// ちなみに 追加のみ 5ms 10,000回
  sl.Sorted := false;
  for i := 1 to 10000 do begin
    sl.Append(FormatCurr('000000',Random(1000000)));
  end;

データを最後に追加してから並べ替えるより、データを突っ込むところを探して
追加する方が速いのでしょうね。たぶん。



[7285] Re:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 08:25:39 たてぐや
▼ takiさん

私はこんなコードを長年使っています。参考になれば。


procedure TFrmMain.GridSort(Grid: TStringGrid; SortCol: Integer);
{===============================================================================
グリッドをソートする。
===============================================================================}
var
  str_St1: TStringList;
  str_St2:  TStringList;
  int_i: Integer;
begin
  str_St1 := TStringList.Create;
  str_St1.Assign(Grid.Cols[SortCol]);

  for int_i := 1 To Grid.FixedRows Do str_St1.Delete(0);
  for int_i := 0 to str_St1.Count - 1 do
        str_St1.Strings[int_i] := str_St1.Strings[int_i] + #1 + Format('%.10d',[int_i]);
  for int_i := Grid.FixedRows to Grid.RowCount - 1 do begin
    str_St2 := TStringList.Create;
    str_St2.Assign(Grid.Rows[int_i]);
    str_St1.Objects[int_i - Grid.FixedRows] := str_St2;
  end;
  str_St1.Sort;

  for int_i := Grid.FixedRows to Grid.RowCount - 1 do begin
    Grid.Rows[int_i].Assign(TStringList(str_St1.Objects[int_i -
    Grid.FixedRows]));
    TStringList(str_St1.Objects[int_i - Grid.FixedRows]).Free;
  end;
  str_St1.Free;
end;


[7286] Re2:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 11:10:46 taki
▼ たてぐやさん
 
> 私はこんなコードを長年使っています。参考になれば。

たてぐやさん ありがとうございます。
でも、残念ながら私の能力不足のためコードが読み解けません。(T_T)

str_St1.Assign(Grid.Cols[SortCol]);とかは分かります。
ソートのKeyとなるデータをstr_St1にコピーしているのですね。

for int_i := 1 To Grid.FixedRows Do str_St1.Delete(0);は見出しの
部分を取り除いて…

for int_i := 0 to str_St1.Count - 1 do
  str_St1.Strings[int_i] := str_St1.Strings[int_i] +
   #1 + Format('%.10d',[int_i]);
ではKeyとなるデータの後に#1とIndexをくっつけて記憶して…

次に、str_St2.Assign(Grid.Rows[int_i]);では
Gridの行のデータ(レコード単位)をStr_St2にコピーして、

str_St1.Objects[int_i - Grid.FixedRows] := str_St2;で
それをオブジェクトとしてStringListに代入?して・・・

つまり、Str_St1にはKeyの文字列とGridの行のデータを持った状態で
Str_St1.Sortする?

その後、
Grid.Rows[int_i].Assign(TStringList(str_St1.Objects[int_i -
    Grid.FixedRows]));では
str_St1に保存したオブジェクトをTStringListとして取り出して
さらにGridのRowデータとしてコピー(書き換え)する。

で、正しいでしょうか?


[7287] Re3:StringList ソートの速さ比べ返信 削除
2014/3/1 (土) 11:30:35 taki
えっ!
 
> for int_i := 0 to str_St1.Count - 1 do
>   str_St1.Strings[int_i] := str_St1.Strings[int_i] +
>    #1 + Format('%.10d',[int_i]);
> ではKeyとなるデータの後に#1とIndexをくっつけて記憶して…
>


 #1 + Format('%.10d',[int_i]) の部分の役割が…


[7292] Re4:StringList ソートの速さ比べ返信 削除
2014/3/2 (日) 21:41:15 たてぐや
▼ takiさん

 最初に謝ってしまいます。これは私が書いたコードではありません。7年くら
い前に必要生じて、Webで見つけたコードです。ですので、私も読み解いてはい
ません。実際に使ってみたら、思い通りの動作をしてくれるし、汎用性がある
ので、よく使う手続きや関数をまとめたMylib.pasにインプリメントしています。

[▼次のスレッド]
INCM/CMT
Cyclamen v3.82