![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Оптимизируйте конструкцию [D6, Win2k]
Сатир © (2002-11-08 20:17:00)if fBase<>nil then fBase.fChilds.Remove(Self);
fBase := Value;
if fBase<>nil then fBase.fChilds.Add(Self);
UpdateColors(0);
Anatoly Podgoretsky (2002-11-10 21:28:00) [1]Значит мое предположение было верное.
А с этим я полностью согласен.
Fantasist (2002-11-10 21:17:00) [2]Цитирую себя:
"Можно записать так, чтобы не возникала иллюзия, что один объект проверяется два раза. А оптимизировать в этом куске нечего."
Этого достадочно?
Anatoly Podgoretsky (2002-11-10 21:14:00) [3]В чем состоит твоя оптимизация, кроме смены порядка операторов и некоторого замедления? Ну и конечно не считая того что это более читабельная версия. Конечно если последнее то да, это очень важно = хорошая читабельность залог того что меньше будет ошибок.
Fantasist (2002-11-10 21:03:00) [4]
if Assigned(fBase) then fBase.fChilds.Remove(Self);
if Assigned(Value) then Value.fChilds.Add(Self);
fBase := Value;
UpdateColors(0);
Можно записать так, чтобы не возникала иллюзия, что один объект проверяется два раза. А оптимизировать ы этом куске нечего.
Сатир (2002-11-10 20:14:00) [5]да, скорее всего, здесь уже нечего оптимизировать...
AlexT1000 (2002-11-09 12:17:00) [6]Моджахед
стопудово неправильно написано.
Anatoly Podgoretsky дело говорит.
соображать надо больше , а думать меньше
Anatoly Podgoretsky (2002-11-09 11:41:00) [7]Моджахед (09.11.02 00:14)
Абсолютно неправильно и получил абсодютно неверный результат.
Предмета для спора нет, могу только урок ппровести.
fChilds не описано, но это что типа списка или подобное.
Алгоритм
1. если старое значение не равно нулю, то убрать из списка,
у тебя даже до этой стадии не доходит если новое уже нуль
2. заменить старое значение новым, см п.1.
3. если новое значение не нуль, то добавить в списек
у тебя если старое нуль, то не выполнится пункт 2
и пункт 3 алгоритма
Теперь мы видим, что минимально два сравнения, одно со старим значение поля и одно для нового значения поля и одно обязательное присваивание.
Единственно что возможно необходимо оптимизировать, то это пункт 4, если старое и новое равны, то может стоит не делать UpdateColors(0), но это зависит от задачи и реализации списков и данной процедуры, а также от ее продолжительности.
Alex44 (2002-11-09 02:37:00) [8]2 Моджахед
Absolutno nepravil"no!
> If Value = nil then Exit;
Chto, esli fBase <> nil and Value = nil ?
Моджахед (2002-11-09 00:31:00) [9]2 Ученик © (09.11.02 00:24)
Вот я и говорю (предполагаю) о изьяне в логике вего компонента
Ученик (2002-11-09 00:24:00) [10]{ DB.PAS}
procedure TDataSource.SetDataSet(ADataSet: TDataSet);
begin
if IsLinkedTo(ADataSet) then DatabaseError(SCircularDataLink, Self);
if FDataSet <> nil then FDataSet.RemoveDataSource(Self);
if ADataSet <> nil then ADataSet.AddDataSource(Self);
end;
Моджахед (2002-11-09 00:14:00) [11]Anatoly Podgoretsky © (08.11.02 22:55)
Я полагаю, что я правильно распутал логику приведеного кода. Плюс предположительную логику всего остального.
Если вам будет интересен спор (а мне да) то мы можем аргументрированно поспорить.
Anatoly Podgoretsky (2002-11-08 22:55:00) [12]Моджахед (08.11.02 22:44)
Все красиво, вот только не правильно работает, не в соответствии с логикой.
Сатир © (08.11.02 20:17)
Конструкция уже потимизирована.
Моджахед (2002-11-08 22:47:00) [13]И вообще, мне кажетя (я не видел основного кода компонента и не могу с точностью восстановить логику), так вот, мне кажется, что когда появляется необходимость в такого рода кривоватых имплементациях обновления свойства, то, значит, логика компонента построена непродуманно.
Уж простите.
Моджахед (2002-11-08 22:44:00) [14]Оптимизировать только потому, что повторяется 2 раза условие? Тогда решай, что важнее -- ясность кода или мифическая (в мили-мили-мили секундах) разница.
Если скорость выполнения, то можно так:
If Value = nil then Exit;
If fBase <> nil then with fBase do
begin
fChilds.Remove(Self);
fBase := Value;
fChilds.Add(Self);
end;
UpdateColors(0);
Сразу же отсекаются дальнейшие проверки в случае если Value=nil. Уже плюс. Также тебе уже не мучает повторяющееся условии. Ну и еще пара плюсов в скорости.
Но читать труднее. Решай сам.
down (2002-11-08 22:06:00) [15]<>nil можно заменить на Assigned, будет чуть красивей
Di_wind (2002-11-08 21:55:00) [16]Объекты одинаковые, разные методы ;)
TTCustomDelphiMaster (2002-11-08 21:53:00) [17]Условия похожие, но объекты то разные. Так что все правильно.
Сатир (2002-11-08 21:28:00) [18]просто смущает дважды повторение одного и того же условия;(
TTCustomDelphiMaster (2002-11-08 20:59:00) [19]По каким параметрам: скорость, размер.
В приципе нормальная конструкция.