[ 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. |