Форум: "Начинающим";
Текущий архив: 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.047 c