![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Скорость.... неужели конструктор так тормозит [D7, WinXP]
Bes © (2005-09-04 02:24:00)Иммется цикл... не очень большой порядка 3000 повторений.
Есть...
procedure _TClassName.ProcedureName;
var
i:integer;
begin
for i:=0 to self.Array_count-1 do
begin
.....
(1) Какие-то действия с self.Array (массив)
.....
end;
end;
Завершается практически моментально
а если сделать так...
procedure _TClassName.ProcedureName;
var
i:integer;
begin
for i:=0 to self.Array_count-1 do
begin
.....
(2) TArrayClass.Create(self.Array);
.....
end;
end;
Здесь (2) в конструкторе TArrayClass выполняются абсалютно теже действия с массивом что и в (1)
Но скорость выполнения поразительно изменилась... т.е. занимает все это стало чуть ли не минуту.
Действие с массивом банальные - чистое присвоение...
constructor TArrayClass.Create(array:TArray);
begin
self.FirstElem:=array[0];
self.SecondElem:=array[1];
....
end;
но если изменить код вот так...
procedure _TClassName.ProcedureName;
var
i:integer;
AC:TArrayClass;
begin
AC:=TArrayClass.Create;
for i:=0 to self.Array_count-1 do
begin
with AC do begin
self.FirstElem:=array[0];
self.SecondElem:=array[1];
....
end;
end;
AC.free;
end;
и о класс... все работает быстро так же как и в первом примере...
Неужеле КОНСТРУКТОР ТАК СИЛЬНО ЗАГРУЖАЕТ ПРОЦ? у меня кстати не слабая машинка-то - PIV 3.2Mhz...
меня глючит?
vidiv (2005-09-06 05:34:00) [1]судя по тому что ты TArrayClass.Create(self.Array) ничему не присваиваешь, полученый объект тебе не нужен, тогда попробуй так:
procedure _TClassName.ProcedureName;
var
i:integer;
begin
for i:=0 to self.Array_count-1 do
begin
.....
with TArrayClass.Create(self.Array) do Free;
.....
end;
end;
Defunct (2005-09-04 21:08:00) [2]> Суслик
imho, чел основательно запутался в собственном коде как раз из-за self. Ведь.
constructor TArrayClass.Create(array:TArray);
..
self.FirstElem:=array[0];
абсолютно не равно этому:
procedure _TClassName.ProcedureName;
..
with AC do begin
self.FirstElem:=array[0];
Во втором случае self ведь указывает на _TClassName, а не на TArrayClass.
Суслик (2005-09-04 19:44:00) [3]
> [3] Defunct © (04.09.05 05:14)
> Зачем так часто пишешь self? какая в этом необходимость?
такое ощущение, что человек из java пришел :) Там это часто делают.
Простите за оффтоп.
Гаврила (2005-09-04 14:26:00) [4]Не конструктор загружает процесс, а операция выделеня памяти.
Ты в цикле 3000 раз выделяешь память под объект TArrayClass - это и является причиной задержки
Bes (2005-09-04 12:54:00) [5]теперь дайвайте начнем меня упрекать что я забыл ";" расставить...
вопрос снят....
Defunct (2005-09-04 05:14:00) [6]Зачем так часто пишешь self? какая в этом необходимость?
Германн (2005-09-04 03:17:00) [7]1. Неполнаяправда, гораздо жуже полнойлжи!
2.Надергав несколько кусков из программы, не представишь её!
kami (2005-09-04 02:47:00) [8]3000 раз создать экземпляры класса, ни разу не уничтожить :))
Попробуй объявить конструктор как Create(var array:TArray); (или const)