[ milnen @ 24.05.2020. 14:44 ] @
U nekoj petlji, koja se izvršava mnogo puta, mi se našao ComboBox.Items.Count i trebalo mi je dosta vremena da utvrdim da on usporava stvari.
Dakle, pitanje je zašto je značajno sporiji pristup Items.Count ili Items[k] kod ComboBox-a, nego što je to kod StringLista?
Evo primera programa, koji iste stvari radi sa ComboBoxom i StringListom. Kod mene prva petlja radi oko 800 ms, druga 1900, a treća i četvrta po 0 ms.
Koristim Delphi 10.2.
Code:
unit Main;

interface

uses
  Winapi.Windows, Winapi.Messages, System.SysUtils, System.Variants, System.Classes, Vcl.Graphics,
  Vcl.Controls, Vcl.Forms, Vcl.Dialogs, System.Diagnostics, Vcl.StdCtrls;

type
  TForm1 = class(TForm)
    procedure FormShow(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.FormShow(Sender: TObject);
var
  ComboBox : TComboBox;
  StringList : TStrings;
  i,j,k : Integer;
  Stopwatch : TStopwatch;
begin
  StringList := TStringList.Create;
  StringList.Add('1');
  ComboBox := TComboBox.Create(Self);
  ComboBox.Parent := Form1;
  ComboBox.Items.Add('1');

  Stopwatch := TStopwatch.StartNew;
  j:=0;
  for i:=1 to 1000000 do
  j := j + ComboBox.Items.Count;
  ShowMessage(IntToStr(Stopwatch.ElapsedMilliseconds));

  Stopwatch := TStopwatch.StartNew;
  j:=0;
  for i:=1 to 1000000 do
  j := j + StrToInt(ComboBox.Items[0]);
  ShowMessage(IntToStr(Stopwatch.ElapsedMilliseconds));

  Stopwatch.Reset;
  j:=0;
  for i:=1 to 1000000 do
  j := j + StringList.Count;
  ShowMessage(IntToStr(Stopwatch.ElapsedMilliseconds));

  Stopwatch.Reset;
  j:=0;
  for i:=1 to 1000000 do
  j := j + StrToInt(StringList[0]);
  ShowMessage(IntToStr(Stopwatch.ElapsedMilliseconds));

  ComboBox.Free;
  StringList.Free;
  Close;
end;

end.

[ savkic @ 24.05.2020. 15:26 ] @
> U nekoj petlji, koja se izvršava mnogo puta, mi se našao ComboBox.Items.Count i trebalo mi je dosta vremena da
> utvrdim da on usporava stvari.
> Dakle, pitanje je zašto je značajno sporiji pristup Items.Count ili Items[k] kod ComboBox-a, nego što je to kod StringLista?

Zato sto se broj stavki kod komba dobija od Windowsa, slanjem CB_GETCOUNT poruke combobox kontroli, dok je kod StringLista to prosto citanje promenljive. Isto vazi i za pristup pojedinim stavkama, kod comba to ide slanjem windows poruka kontroli.
[ milnen @ 24.05.2020. 16:54 ] @
Hvala na odgovoru!
Da nisam imao staru verziju programa, koja je imala neke fiksne brojeve, pa sam ih unapredio u promenljive, ne bih znao da program može znatno brže da radi. Unutra ima neka silna matematika, pa bih mislio da to toliko traje i da brže ne može :)

Pozdrav!
[ savkic @ 24.05.2020. 18:24 ] @
Obicno se to i ne primeti na par stotina stavki koliko se nadje u ComboBoxu/ListBoxu ili kad se broju stavki pristupa u deklaraciji petlje (samo jedan poziv):
for i := 0 to cb.Items.Count...
[ milnen @ 24.05.2020. 20:54 ] @
Ovo je za mene veliko otkriće.
Sada ću da prelistam zahtevnije programe da vidim da li mogu besplatno da ih ubrzam
[ savkic @ 25.05.2020. 00:14 ] @
Ako imas kriticne delove koji su spori, svakako je dobro da upotrebis neki profiler (ne znam da li ima besplatnih).
[ milnen @ 25.05.2020. 00:49 ] @
Bio je ranije onaj AQTime, ali ga ne vidim u novijim verzijama Dephia.
[ savkic @ 25.05.2020. 08:34 ] @
To je komercijalni paket, moras posebno da ga narucis/instaliras. Ranije su verovatno imali neki dogovor (kao sto imaju sa chart/report proizvodjacima).