Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.

Spor pristup ComboBoxu

[es] :: Pascal / Delphi / Kylix :: Spor pristup ComboBoxu

[ Pregleda: 530 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Autor

Pretraga teme: Traži
Markiranje Štampanje RSS

milnen
Nis

Član broj: 73950
Poruke: 324
*.exe-net.net.



+5 Profil

icon Spor pristup ComboBoxu24.05.2020. u 14:44 - pre 13 meseci
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.

 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2665



+73 Profil

icon Re: Spor pristup ComboBoxu24.05.2020. u 15:26 - pre 13 meseci
> 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.
 
Odgovor na temu

milnen
Nis

Član broj: 73950
Poruke: 324
*.exe-net.net.



+5 Profil

icon Re: Spor pristup ComboBoxu24.05.2020. u 16:54 - pre 13 meseci
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!
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2665



+73 Profil

icon Re: Spor pristup ComboBoxu24.05.2020. u 18:24 - pre 13 meseci
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...
 
Odgovor na temu

milnen
Nis

Član broj: 73950
Poruke: 324
*.exe-net.net.



+5 Profil

icon Re: Spor pristup ComboBoxu24.05.2020. u 20:54 - pre 13 meseci
Ovo je za mene veliko otkriće.
Sada ću da prelistam zahtevnije programe da vidim da li mogu besplatno da ih ubrzam
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2665



+73 Profil

icon Re: Spor pristup ComboBoxu25.05.2020. u 00:14 - pre 13 meseci
Ako imas kriticne delove koji su spori, svakako je dobro da upotrebis neki profiler (ne znam da li ima besplatnih).
 
Odgovor na temu

milnen
Nis

Član broj: 73950
Poruke: 324
*.exe-net.net.



+5 Profil

icon Re: Spor pristup ComboBoxu25.05.2020. u 00:49 - pre 13 meseci
Bio je ranije onaj AQTime, ali ga ne vidim u novijim verzijama Dephia.
 
Odgovor na temu

savkic
Igor Savkić

Moderator
Član broj: 92186
Poruke: 2665



+73 Profil

icon Re: Spor pristup ComboBoxu25.05.2020. u 08:34 - pre 13 meseci
To je komercijalni paket, moras posebno da ga narucis/instaliras. Ranije su verovatno imali neki dogovor (kao sto imaju sa chart/report proizvodjacima).
 
Odgovor na temu

[es] :: Pascal / Delphi / Kylix :: Spor pristup ComboBoxu

[ Pregleda: 530 | Odgovora: 7 ] > FB > Twit

Postavi temu Odgovori

Navigacija
Lista poslednjih: 16, 32, 64, 128 poruka.