Novo

Forum kao aplikacija na telefonu

Dodajte forum na početni ekran i koristite ga kao aplikaciju, sa menijem na dnu ekrana.

  • 7 odgovora
  • 1.927 pregleda

Najnovija ↓

Spor pristup ComboBoxu 24.05.2020. u 15:44 · pre 78 meseci #1
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.

Re: Spor pristup ComboBoxu 24.05.2020. u 16:26 · pre 78 meseci #2
> 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.
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Spor pristup ComboBoxu 24.05.2020. u 17:54 · pre 78 meseci #3
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!
Re: Spor pristup ComboBoxu 24.05.2020. u 19:24 · pre 78 meseci #4
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...
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Spor pristup ComboBoxu 24.05.2020. u 21:54 · pre 78 meseci #5
Ovo je za mene veliko otkriće.
Sada ću da prelistam zahtevnije programe da vidim da li mogu besplatno da ih ubrzam :)
Re: Spor pristup ComboBoxu 25.05.2020. u 01:14 · pre 78 meseci #6
Ako imas kriticne delove koji su spori, svakako je dobro da upotrebis neki profiler (ne znam da li ima besplatnih).
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Re: Spor pristup ComboBoxu 25.05.2020. u 01:49 · pre 78 meseci #7
Bio je ranije onaj AQTime, ali ga ne vidim u novijim verzijama Dephia.
Re: Spor pristup ComboBoxu 25.05.2020. u 09:34 · pre 78 meseci #8
To je komercijalni paket, moras posebno da ga narucis/instaliras. Ranije su verovatno imali neki dogovor (kao sto imaju sa chart/report proizvodjacima).
Potpis
Do not be a help vampire (http://slash7.com/pages/vampires), use the google.

How to ask questions the smart way:
http://www.catb.org/~esr/faqs/smart-questions.html
http://solair.eunet.rs/~fangor...stions/smart-questions.sr.html
Prijavite se da biste odgovorili u ovoj temi.PrijavaRegistracija

Premeštanje teme