Delphi DX 10,3 VS Delphi 6 спектаклей - PullRequest
1 голос
/ 16 апреля 2020

Я очень давно использую Delphi 6 , и недавно я начал использовать версию Delphi DX Rio 10.3 . Несмотря на все мои ожидания, мне кажется, что загрузка элементов на стандартные элементы управления (ComboBox, Listbox и т. Д.) в DX RIO значительно медленнее (во время выполнения), чем в D6 (оба в режиме DEBUG и RELEASE после активации всех оптимизаций). Я попытался использовать BeginUpdate / EndUpdate, не меняя разницу в скорости между средами.

Я хотел бы спросить, есть ли у кого-нибудь какие-либо предложения по улучшению производительности DX 10.3 Combobox / Listbox . Специфическая c проблема, которую я пытаюсь решить в моем реальном приложении, заключается в загрузке нескольких десятков элементов в 10-20 комбинациях / списках элементов управления в моей форме.

Я написал очень простой тест для стандарта COMBO. Одна и та же программа работает как в D6, так и в DX RIO. На моей машине разработки (Win 10 pro) программа, скомпилированная с D6, занимает около 1 секунда , в то время как программа, скомпилированная с DX RIO, занимает примерно в четыре раза больше .

Заранее большое спасибо за ваши ответы.

{$A+,B-,C+,D+,E-,F-,G+,H+,I+,J-,K-,L+,M-,N+,O+,P+,Q-,R-,S-,T-,U-,V+,W-,X+,Y+,Z1}

unit Unit1;

interface

uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
     cb: TComboBox;
     txt_count: TLabel;
     btn: TButton;
     procedure btnClick(Sender: TObject);
  end;

var Form1: TForm1;

implementation

{$R *.dfm}

var dt_start_timer : TDatetime;

procedure start_timer;
begin
    dt_start_timer := now
end;

function delta_timer_msec : longint;
begin
    result := round((now - dt_start_timer) * 24*60*60*1000)
end;

procedure execute(father : TForm;cb : TComboBox;txt : TLabel;bo_disable_update : boolean);
const
    MAX = 100;
    ITEMS_COUNT = 1000;
var i, j : integer;
begin
    start_timer;
    if bo_disable_update then cb.Items.BeginUpdate;
    for i := 1 to MAX do begin
        cb.Items.Clear;
        for j := 1 to ITEMS_COUNT do cb.Items.Add('text-' + intToStr(j))
    end;
    if bo_disable_update then cb.Items.EndUpdate;
    txt.Caption := intToStr(delta_timer_msec) + ' msecs'
end;

procedure TForm1.btnClick(Sender: TObject);
begin
    execute(self, cb, txt_count, {disable_update}TRUE)
end;

end.

object Form1: TForm1
  Left = -6
  Top = 117
  Width = 449
  Height = 350
  Caption = 'Form1'
  Color = clBtnFace
  Font.Charset = DEFAULT_CHARSET
  Font.Color = clWindowText
  Font.Height = -11
  Font.Name = 'MS Sans Serif'
  Font.Style = []
  OldCreateOrder = False
  PixelsPerInch = 96
  TextHeight = 13
  object txt_count: TLabel
    Left = 198
    Top = 32
    Width = 44
    Height = 13
    Caption = 'txt_count'
  end
  object cb: TComboBox
    Left = 42
    Top = 28
    Width = 145
    Height = 21
    ItemHeight = 13
    TabOrder = 0
    Text = 'cb'
  end
  object btn: TButton
    Left = 24
    Top = 70
    Width = 251
    Height = 139
    Caption = 'btn'
    TabOrder = 1
    OnClick = btnClick
  end
end
...