![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скорость работы с объектами в Delphi
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, разве сложно провести эксперимент?