Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.08.12;
Скачать: CL | DM;

Вниз

Скорость работы с объектами в Delphi   Найти похожие ветки 

 
Strange man   (2007-07-17 20:55) [0]

Скажите пожалуйста, с чем быстрее работать - с "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=


 
XProger ©   (2007-07-17 21:20) [1]

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


 
Dib@zol ©   (2007-07-17 21:35) [2]


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

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


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


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


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


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


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


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


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

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

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

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


 
Ega23 ©   (2007-07-18 12:57) [5]

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


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


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


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


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


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


> А не в общем?


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


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


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

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


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


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


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

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


 
Ega23 ©   (2007-07-18 13:39) [9]


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


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


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


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


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


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


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


плюс С


 
Sdubaruhnul   (2007-07-18 16:07) [12]

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


 
Ega23 ©   (2007-07-18 16:10) [13]


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


есть такой.


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


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


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


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


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


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


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


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

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

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]
>
> > Но вопрос об удобстве не стоит, вопрос стоит о скорости.
>
> А что скорость? скорость есть приращение перемещения за
> промежуток времени. Первая производная, короче.
> Что с ней не так?

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


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

Strange man   (18.07.07 16:39) [14]

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


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

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

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


 
Strange man   (2007-07-18 16:53) [17]


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

И как сделать нормальный?


 
DevilDevil ©   (2007-07-18 16:54) [18]

Разница между record-ами и классами только в конструкторе/деструкторе.

Обращение к полям "по указателю" выполняется с одной скоростью. Обращение к свойству (read/write field) = обращению к полю.

Следующий вопрос.

К полям record-а в стеке обращение происходит в 2 раза быстрее. Но если пользоваться with, то все "потери" скорее всего соптимизируются до потери 1 такта.

P.S. мне кажется оптимизировать надо в других местах


 
Сергей М. ©   (2007-07-18 16:56) [19]


> как сделать нормальный?


Для начала изучить принцип действия конкретного оптимизирующего компимлятора.

Боюсь, тебе это не по силам, судя по амбициям)


 
Сергей М. ©   (2007-07-18 16:57) [20]


> К полям record-а в стеке обращение происходит в 2 раза быстрее


галиматья несусветная)


 
DevilDevil ©   (2007-07-18 16:58) [21]

если тебе так хочется это услышать, то "с классами работать не быстрее"


 
Сергей М. ©   (2007-07-18 16:58) [22]


> с классами работать не быстрее


Галиматья несусветная)


 
DevilDevil ©   (2007-07-18 17:00) [23]

var
 R : TRect;
begin
//...
 Result := R.Left; // 1 такт (1 операция)
end;

var
 R : PRect;  
//...
 Result := R.Left; // 2 такта (2 операции)


 
DevilDevil ©   (2007-07-18 17:03) [24]

function SomeProc(R : PRect) : integer;
begin
// ...

Result := R.Left; // 1 такт если eax не был запорчен
end;


 
DevilDevil ©   (2007-07-18 17:04) [25]

var
 R : TRect;

function SomeProc() : integer;
begin
// ...
 Result := R.Left; // 1 такт
end;


 
Strange man   (2007-07-18 17:05) [26]


> DevilDevil ©   (18.07.07 16:54) [18]
> Разница между record-ами и классами только в конструкторе/деструкторе.
>
>
> Обращение к полям "по указателю" выполняется с одной скоростью.
>  Обращение к свойству (read/write field) = обращению к полю.
>
>
> Следующий вопрос.
>
> К полям record-а в стеке обращение происходит в 2 раза быстрее.
>  Но если пользоваться with, то все "потери" скорее всего
> соптимизируются до потери 1 такта.

Спасибо.

> P.S. мне кажется оптимизировать надо в других местах

В каких?

> Сергей М. ©   (18.07.07 16:56) [19]

Можешь в 2х словах объяснить, почему мой тест тупой? Что я не учитываю?


 
Сергей М. ©   (2007-07-18 17:06) [27]


> Strange man   (18.07.07 17:05) [26]


С системой команд целевого ЦП ты, надеюсь, знаком ?


 
Strange man   (2007-07-18 17:10) [28]

Знаком, по крайней мере есть справочник


 
DevilDevil ©   (2007-07-18 17:10) [29]

> Сергей М. ©   (18.07.07 16:58) [22]
> с классами работать не быстрее
> Галиматья несусветная)


если вопрос в скорости обращения к полям... то "Какие ваши доказательства"(с) ?


 
Sdubaruhnul   (2007-07-18 17:11) [30]

>есть такой.

Спасибо за подтверждение.

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

Если речь о TreeView, то можно было бы догадаться, что записи в качестве... там-дадам... УЗЛОВ.

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

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

Чё? Я так понимаю, что ты хочешь сказать, что единственная причина того, что VirtualTreeView работает быстрее, чем стандартный контрол - только в использовании записей в качестве узлов? Тем самым ты утверждаешь, что использование записей даёт такой существенный прирост в скорости?

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

Стандартного дерева, которое использует класс TTreeNode в качестве узлов.


 
Игорь Шевченко ©   (2007-07-18 17:12) [31]

DevilDevil ©   (18.07.07 17:00) [23]

Это было давно и неправда. На современных процессорах количество команд в единицу времени не выражается целыми числами с учетом конвейеров.


 
Сергей М. ©   (2007-07-18 17:13) [32]


> Знаком, по крайней мере есть справочник


Ну так и посмотри на код, генерируемый компайлером в том или ином случае !

В чем проблема-то ?


> DevilDevil ©   (18.07.07 17:10) [29]


см. выше)


 
Сергей М. ©   (2007-07-18 17:15) [33]

"блохоловы", блинн)


 
Сергей М. ©   (2007-07-18 17:15) [34]

"игролепщики")


 
Ega23 ©   (2007-07-18 17:17) [35]


> Чё? Я так понимаю, что ты хочешь сказать, что единственная
> причина того, что VirtualTreeView работает быстрее, чем
> стандартный контрол - только в использовании записей в качестве
> узлов? Тем самым ты утверждаешь, что использование записей
> даёт такой существенный прирост в скорости?


У тебя с адекватностью как? Я говорю, что яхта лучше чем первая казанка с подвесным мотором. А ты на основании этого делаешь вывод, что дизель - лучше. Потому что солярку использует.


 
Ega23 ©   (2007-07-18 17:19) [36]

Ещё раз рекомендую заглянуть в исходники TCustomTreeView и посмотреть, как этот монстр реализован.


 
DevilDevil ©   (2007-07-18 17:20) [37]

> Игорь Шевченко ©   (18.07.07 17:12) [31]

согласен. есть ряд вопросов, которые я недопонимаю. Почему до сих пор указывают такты, например. Какие-то по одному, ряд fpu-шных по 3 такта, деление - почти 30.

но стоит согласиться, что в среднем, 2 команды mov выполняются в 2 раза медленнее, чем 1. По данному поводу, надеюсь, характерных здесь придирок не будет.


 
Sdubaruhnul   (2007-07-18 17:49) [38]

>Ega23 ©   (18.07.07 17:19) [36]

Спасибо, но ничего полезного, а главное монструозного там нет. Ах да, пока я пишу эти строки, 500 000 узлов продолжают добавляться.

Теперь твоя очередь смотреть на VirtualTreeView. И про солярку больше не надо. Сначала смотри, что цитируешь, а потом отвечай.


 
Ega23 ©   (2007-07-18 18:03) [39]


> Спасибо, но ничего полезного, а главное монструозного там
> нет. Ах да, пока я пишу эти строки, 500 000 узлов продолжают
> добавляться.


BeginUpdate - EndUpdate поставил?
А ещё рекомендую посмотреть в сторону, например, CreateWnd - DestroyWnd


 
Ega23 ©   (2007-07-18 18:04) [40]

Я это всё к чему:
Неужели ты действительно считаешь, что VirtualTreeView работает быстрее ТОЛЬКО из-за того, что там рекорды используются в качестве описателя узла???



Страницы: 1 2 вся ветка

Текущий архив: 2007.08.12;
Скачать: CL | DM;

Наверх




Память: 0.58 MB
Время: 0.029 c
15-1184503367
Kerl
2007-07-15 16:42
2007.08.12
Книги D7


3-1177243506
ZevSS
2007-04-22 16:05
2007.08.12
Обратная связь с MS SQL


2-1184592686
avp
2007-07-16 17:31
2007.08.12
Чем отличаются фундаментальные типы данных от общих?


2-1184647927
Knob
2007-07-17 08:52
2007.08.12
Регулировка звука


4-1172489276
MEV
2007-02-26 14:27
2007.08.12
дамп памяти процесса