Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

Скорость работы с объектами в Delphi


Страницы:   1 2 3 4

Strange man ©   (2007-07-17 20:55:00) 

Скажите пожалуйста, с чем быстрее работать - с "class-like" records или с классами? Насколько велика разница? Если учитывать, что записи тоже будут создаваться динамически, т. к. в основном они используются как Array of record.
Ещё встречный вопрос: с чем быстрее работать - с памятью в стэке или с памятью, выделенной динамически? Почему?
Поиск не помонает: http://www.google.com/search?hl=ru&q=%D1%87%D1%82%D0%BE+%D0%B1%D1%8B%D1%81%D1%82%D1%80%D0%B5%D0%B5+class+record&btnG=%D0%9F%D0%BE%D0%B8%D1%81%D0%BA&lr=


Сергей М.   (2007-07-18 16:48:00) [61]

Твой "тупой" тест абсолютно ни о чем не говорит)

Бо ты ничерташеньки не шаришь в ключевых моментах)


Игорь Шевченко   (2007-07-18 16:46:00) [62]

Strange man   (18.07.07 16:39) [14]

Нафига ты такую бесполезную программу пишешь ?


Strange man   (2007-07-18 16:39:00) [63]


> Ты что, атомы что ли расщепляешь там ?)

Да, именно (классная шутка :|)

unit Unit2;

interface

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

type
 TForm2 = class(TForm)
   Button1: TButton;
   Label1: TLabel;
   procedure FormDestroy(Sender: TObject);
   procedure FormCreate(Sender: TObject);
   procedure Button1Click(Sender: TObject);
 end;

 TC = class
   a, b, c: Integer;
   procedure Proc;
 end;

 TR = packed record
   a, b, c: Integer;
   procedure Proc;
 end;

 procedure Proc;

var
 Form2: TForm2;
 cl1, cl2: TC;
 r1: TR;
 r2: Array of TR;
 a1, b1, c1: Integer;
 a2, b2, c2: ^Integer;

implementation

{$R *.dfm}

var
a3, b3, c3: Integer;

function GetTickCount: DWord;
var f, t: Int64;
begin
if QueryPerformanceCounter (t) then
begin
 QueryPerformanceFrequency (f);
 Result := Round (1000 * t / f);
end else Result := Windows.GetTickCount;
end;

procedure TC.Proc;
begin
a := 0;
end;

procedure TR.Proc;
begin
a := 0;
end;

procedure Proc;
begin
a3 := 0;
end;

procedure TForm2.Button1Click(Sender: TObject);
var
i: Integer;
s: Dword;
a4, b4, c4: Integer;
begin
Label1.Caption := '';

s := GetTickCount;
for i := 0 to 1000000000 do proc;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'proc             ' + IntToStr (s) + Chr($D);

s := GetTickCount;
for i := 0 to 1000000000 do r1.proc;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'record proc      ' + IntToStr (s) + Chr($D);

s := GetTickCount;
for i := 0 to 1000000000 do r2[0].proc;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'dyn.array proc   ' + IntToStr (s) + Chr($D);
s := GetTickCount;

for i := 0 to 1000000000 do cl1.proc;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'class proc       ' + IntToStr (s) + Chr($D);

s := GetTickCount;
for i := 0 to 1000000000 do a1 := b1 + c1;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'int. var data    ' + IntToStr (s) + Chr($D);

s := GetTickCount;
for i := 0 to 1000000000 do a2^ := b2^ + c2^;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'dynamic data     ' + IntToStr (s) + Chr($D);

s := GetTickCount;
for i := 0 to 1000000000 do a3 := b3 + c3;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'imp. var data    ' + IntToStr (s) + Chr($D);

 s := GetTickCount;
for i := 0 to 1000000000 do a4 := b4 + c4;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'local var data   ' + IntToStr (s) + Chr($D);

s := GetTickCount;
for i := 0 to 1000000000 do with r1 do a := b + c;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'record data      ' + IntToStr (s) + Chr($D);
   
s := GetTickCount;
for i := 0 to 1000000000 do with r2[0] do a := b + c;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'dyn.array data   ' + IntToStr (s) + Chr($D);
     
s := GetTickCount;
for i := 0 to 1000000000 do with cl1 do a := b + c;
s := GetTickCount - s;
Label1.Caption := Label1.Caption + 'class data       ' + IntToStr (s) + Chr($D);

Beep;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
cl1 := TC.Create;
cl2 := TC.Create;
SetLength (r2, 1);
New(a2); New(b2); New(c2);
end;

procedure TForm2.FormDestroy(Sender: TObject);
begin
cl1.Free;
cl2.Free;
SetLength (r2, 0);
Dispose (a2); Dispose (b2); Dispose (c2);
end;

end.


В результате:

proc                2630        
record proc         2254
dyn.array proc      2254
class proc          2254
interface data      752
impl data           1060-1100
local data          375
dynamic data        1879
record data         752
dyn.array data      1377
class data          1879

Это "индифферентно"?


> Ega23 ©   (18.07.07 13:39) [9]
>
> > Но вопрос об удобстве не стоит, вопрос стоит о скорости.
>
> А что скорость? скорость есть приращение перемещения за
> промежуток времени. Первая производная, короче.
> Что с ней не так?

Да вы тут все прям остряки


Ega23   (2007-07-18 16:10:00) [64]


> Есть такой компонент - VirtualTreeView.


есть такой.


> Он работает гораздо быстрее стандартного TreeView и многих
> других, потому что использует записи вместо классов


Гм... Записи чего? И вместо каких классов?


> хотя это не единственная причина.


Ты для начала загляни в реализацию TCustomTreeView, а потом говори.


> Вот, в данном случае записи оказались быстрее.


Быстрее чего(кого)?


Sdubaruhnul   (2007-07-18 16:07:00) [65]

Есть такой компонент - VirtualTreeView. Он работает гораздо быстрее стандартного TreeView и многих других, потому что использует записи вместо классов, хотя это не единственная причина. Вот, в данном случае записи оказались быстрее.


Ega23   (2007-07-18 14:00:00) [66]


> Это перемещение есть интеграл от скорости, не ври :)


плюс С


Игорь Шевченко   (2007-07-18 13:47:00) [67]


> скорость есть приращение перемещения за промежуток времени


Это перемещение есть интеграл от скорости, не ври :)


Ega23   (2007-07-18 13:39:00) [68]


> Но вопрос об удобстве не стоит, вопрос стоит о скорости.


А что скорость? скорость есть приращение перемещения за промежуток времени. Первая производная, короче.
Что с ней не так?


Сергей М.   (2007-07-18 13:27:00) [69]


> вопрос стоит о скорости


Ты что, атомы что ли расщепляешь там ?)

Или цацки-бирюльки компьютерные покоя не дают ?)


Strange man   (2007-07-18 13:25:00) [70]


> Ega23 ©   (18.07.07 12:57) [5]
> С объектами удобнее.

С какими объектами? TObj = object?
Но вопрос об удобстве не стоит, вопрос стоит о скорости.


Сергей М.   (2007-07-18 12:58:00) [71]


> Вызов методов


Методы методам рознь.


> операции с полями


Операции операциям рознь.


> А не в общем?


А где упоминание о частности ?


Ega23   (2007-07-18 12:57:00) [72]

С объектами удобнее.


Strange man   (2007-07-18 12:40:00) [73]


> Работа работе рознь.
> Требуются уточнения..

Любые действия. Вызов методов, операции с полями

> В общем случае индифферентно.

А не в общем? :)


Сергей М.   (2007-07-18 10:28:00) [74]


> с чем быстрее работать - с "class-like" records или с классами?


Работа работе рознь.
Требуются уточнения..


> с чем быстрее работать - с памятью в стэке или с памятью,
>  выделенной динамически?


В общем случае индифферентно.


Dib@zol   (2007-07-17 21:35:00) [75]


> "class-like" records или с классами?

По-моему со структурами, сиречь рэкордами. Тк. классы ешшо создать нада... А вообще было тут где-то такое обсуждение... Или не тут - не помню.


XProger   (2007-07-17 21:20:00) [76]

Strange man, разве сложно провести эксперимент?


Страницы:   1 2 3 4

Наверх

Титульная страница Поиск, карта сайта Написать письмо