Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.08.12;
Скачать: [xml.tar.bz2];

Вниз

Скорость работы с объектами в 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;
Скачать: [xml.tar.bz2];

Наверх




Память: 0.56 MB
Время: 0.043 c
15-1184528402
ari_9
2007-07-15 23:40
2007.08.12
есть ли хорошая дока по QuantumGrid, кроме стандартного хелпа ?


2-1184611472
bagos
2007-07-16 22:44
2007.08.12
chart


2-1184332482
GMH
2007-07-13 17:14
2007.08.12
вызываемая Getmodulefilemameex


3-1177412617
DelphiN!
2007-04-24 15:03
2007.08.12
Очень долгий Insert в таблицу БД FireBird 1.5


3-1177508561
DelphiLexx
2007-04-25 17:42
2007.08.12
DBGrid и опция dgEditing





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский