Модераторы: Poseidon, Snowy, bems, MetalFan

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Замена if else 
:(
    Опции темы
chip_and_dayl
Дата 3.8.2012, 12:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: 1
Всего: 9



Всем привет.

В коде есть следующее ветвление ifов

Код

if codeView='TfrmBasicCardSecond' then
       result:=TfrmBasicCardSecond.Create(aowner, order)
  else if codeView='TfrmBasicCardSecondAdd' then
       result:=TfrmBasicCardSecondAdd.Create(aowner, order)

  else if codeView='TfrmFrameFrontCard' then
       result:=TfrmFrameFrontCard.Create(aowner, order)

  else if codeView='TfrmFrameGroupSeqNum' then
       result:=TfrmFrameGroupSeqNum.Create(aowner, order)
  else if codeView='TfrmFrameGroupSeqNumAdd' then
       result:=TfrmFrameGroupSeqNumAdd.Create(aowner, order)

  else if codeView='TfrmFrameGroupSeqNumCell' then
       result:=TfrmFrameGroupSeqNumCell.Create(aowner, order)
  else if codeView='TfrmFrameGroupSeqNumCellAdd' then
       result:=TfrmFrameGroupSeqNumCellAdd.Create(aowner, order)

  else if codeView='TfrmBasicCardSecondEnd' then
       result:=TfrmBasicCardSecondEnd.Create(aowner, order)
  else if codeView='TfrmBasicCardSecondEndAdd' then
       result:=TfrmBasicCardSecondEndAdd.Create(aowner, order)
   ......  
   else result:=TfrmFrameBasicCard.create(aowner, order);
 

Так как этот код вызывается очень часто, то затормаживается работа программы. Как можно это ускорить/оптимизировать?

Это сообщение отредактировал(а) chip_and_dayl - 3.8.2012, 12:51


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
Akella
Дата 3.8.2012, 13:05 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 36
Всего: 329



все должны угадать, что там живёт в Create?

Добавлено через 54 секунды
Если код вызывается очень часто, то создай всё один раз, но не показывай. В нужный момент просто показывай/прячь.
PM MAIL   Вверх
chip_and_dayl
Дата 3.8.2012, 13:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 603
Регистрация: 22.4.2007
Где: Украина, Киев

Репутация: 1
Всего: 9



Цитата(Akella @  3.8.2012,  13:05 Найти цитируемый пост)
все должны угадать, что там живёт в Create?

Проблема именно в if, поэтому в креейт смотреть не нужно.

Вызывается очень часть, каждые 10 секунд и может вызваться от 1 до 200 за каждый вызов.


Создать один раз не могу

Добавлено через 8 минут и 54 секунды
result: TfrmAbstractFrameCard

Соответственно все объекты которые создаются, есть наследники TfrmAbstractFrameCard


--------------------
Фсё будет хорошо!!!
PM MAIL Skype   Вверх
XperT
Дата 3.8.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Проблема не в if, он не может тормозить программу больше, чем создание формы, но если так сильно хочется его заменить на что-то более быстрое, то рекомендую посмотреть в сторону этой функции:
Код

uses
  StrUtils;
...

const
  cmdQuit     = 'QUIT';
  cmdLogin    = 'LOGIN';
  cmdPassword = 'PASSWORD';
  cmdArray : Array [ 0..2 ] of String = ( cmdQuit, cmdLogin, cmdPassword );

begin
  case AnsiIndexStr( 'medved', cmdArray ) of
    0 : Beep;
    1 : Beep;
    2 : Beep;
    else Beep;
  end
end;

PM MAIL   Вверх
Qu1nt
Дата 3.8.2012, 13:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 602
Регистрация: 13.1.2007

Репутация: 18
Всего: 50



PM MAIL   Вверх
XperT
Дата 3.8.2012, 13:31 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Так же, если у вас все формы имею одного наследника, то можно посмотреть в сторону TDictionary

Это сообщение отредактировал(а) XperT - 3.8.2012, 13:31
PM MAIL   Вверх
DarkProg
Дата 3.8.2012, 14:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Законченный романтик
***


Профиль
Группа: Завсегдатай
Сообщений: 1784
Регистрация: 11.3.2009
Где: Земля

Репутация: 2
Всего: 19



Пробежавшись по коду могу предложить такой вариант оптимизации:
1. Регистрируете классы при запуске программы(REgisterClass)
2. При вызове функции делаете всего лишь FindClass, далее приводите к требуемому базовому классу и выполняете Create

Собственно пример


--------------------
"И твоя голова всегда в ответе за то куда сядет твой зад..."

"Я студент - скажите с какого я ВУЗа..."

 smile  smile  smile 
PM MAIL   Вверх
northener
Дата 3.8.2012, 14:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(XperT @  3.8.2012,  13:30 Найти цитируемый пост)
но если так сильно хочется его заменить на что-то более быстрое, то рекомендую посмотреть в сторону этой функции

А смысл? Там тот же банальный перебор:
Код

function AnsiIndexStr(const AText: string; const AValues: array of string): Integer;
var
  I: Integer;
begin
  Result := -1;
  for I := Low(AValues) to High(AValues) do
    if AnsiSameStr(AText, AValues[I]) then
    begin
      Result := I;
      Break;
    end;
end;



--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
XperT
Дата 3.8.2012, 16:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 269
Регистрация: 19.8.2006

Репутация: 2
Всего: 4



Цитата(northener @ 3.8.2012,  14:34)
Цитата(XperT @  3.8.2012,  13:30 Найти цитируемый пост)
но если так сильно хочется его заменить на что-то более быстрое, то рекомендую посмотреть в сторону этой функции

А смысл? Там тот же банальный перебор:
Код

function AnsiIndexStr(const AText: string; const AValues: array of string): Integer;
var
  I: Integer;
begin
  Result := -1;
  for I := Low(AValues) to High(AValues) do
    if AnsiSameStr(AText, AValues[I]) then
    begin
      Result := I;
      Break;
    end;
end;

Посыпаю голову пеплом, но я больше чем уверен, что заменив ифы на что-то более оптимальное автор не добьется увеличение скорости, потому что явно проблема в другом.
PM MAIL   Вверх
baldina
Дата 3.8.2012, 16:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



походу там просто очень много if и тормозит именно линейный просмотр
ТСу нужен выбор более эффективный, чем O(n)
альтернативы - дерево O(log(n)) и хеш-таблица O(1)
TDictionary<keyT,valueT>, как я понимаю, хэш и есть

Цитата(XperT @  3.8.2012,  13:31 Найти цитируемый пост)
Так же, если у вас все формы имею одного наследника, то можно посмотреть в сторону TDictionary

наверно даже если не имеют: в качестве valueT можно взять структуру из указателя на член-функцию и самого объекта, TMethod
см. http://forum.vingrad.ru/topic-21991.html
  
PM MAIL   Вверх
Frees
Дата 3.8.2012, 17:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



codeView откуда?

Можно сдеалать одну процедуру которая принимает класс формы (а не имя класса) и создает ее как Application.CreateForm

Можно еще GoF Порождающие шаблоны проектирования полистать.


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
baldina
Дата 4.8.2012, 00:12 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Цитата(Frees @  3.8.2012,  17:46 Найти цитируемый пост)
Порождающие шаблоны проектирования

проблема не в сокращении кода или изяществе, а в трудоемкости выбора.
возможно, значительная переделка проекта позволит вообще избежать этого узкого места, но по умолчанию предполагается, что ТС не дурак и ему нужен ответ на его вопрос, а не констатация убогости его решения.
PM MAIL   Вверх
northener
Дата 4.8.2012, 00:33 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1361
Регистрация: 2.9.2010

Репутация: 8
Всего: 20



Цитата(baldina @  4.8.2012,  00:12 Найти цитируемый пост)
проблема не в сокращении кода или изяществе, а в трудоемкости выбора.
возможно, значительная переделка проекта позволит вообще избежать этого узкого места, но по умолчанию предполагается, что ТС не дурак и ему нужен ответ на его вопрос, а не констатация убогости его решения. 

Хм. Представьте реальный проект с таким узким местом и я с вами соглашусь


--------------------
Но только лошади летают вдохновенно.
Иначе лошади разбились бы мгновенно!
PM MAIL   Вверх
baldina
Дата 4.8.2012, 01:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3433
Регистрация: 5.12.2007
Где: Москва

Репутация: нет
Всего: 101



Цитата(northener @  4.8.2012,  00:33 Найти цитируемый пост)
Представьте реальный проект с таким узким местом

любой проект, где входные данные в виде строк должны отображаться на функции их обработки.
синтаксический анализатор, если угодно.
PM MAIL   Вверх
Frees
Дата 4.8.2012, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 9
Всего: 54



Цитата(baldina @  4.8.2012,  04:07 Найти цитируемый пост)
любой проект, где входные данные в виде строк должны отображаться на функции их обработки.синтаксический анализатор, если угодно.

Неизвестно откуда приходит эта строка, и есть ли возможность заменить строку с именем класса заменить на класс.





--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Чучмек
Дата 4.8.2012, 12:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


НЭТ БИЛЭТ
**


Профиль
Группа: Участник
Сообщений: 841
Регистрация: 11.5.2008
Где: СССР

Репутация: 14
Всего: 41



Ну вот можно сделать по аналогии
Код

type
 tfunc=function(AOwner: TComponent;txt:string):tcontrol;
 tcall=record
  cond:string;
  func:tfunc;
 end;

var mcall:array of tcall;

function _label(AOwner: TComponent;txt:string):tcontrol;
 begin
 result:=tlabel.Create(AOwner);
 (result as tlabel).Caption:=txt;
 end;
function _button(AOwner: TComponent;txt:string):tcontrol;
 begin
 result:=tbutton.Create(AOwner);
 (result as tbutton).Caption:=txt;
 end;
function _edit(AOwner: TComponent;txt:string):tcontrol;
 begin
 result:=tedit.Create(AOwner);
 (result as tedit).Text:=txt;
 end;
function _panel(AOwner: TComponent;txt:string):tcontrol;
 begin
 result:=tpanel.Create(AOwner);
 (result as tpanel).Caption:=txt;
 end;
function _else(AOwner: TComponent;txt:string):tcontrol;
 begin
 result:=nil;
 end;

function call(v:string;AOwner: TComponent;txt:string):tcontrol;
var
 min,max,center,oldcenter,cr:integer;
begin
min:=0;
max:=length(mcall);
oldcenter:=0;
while true do
 begin
 center:=min +((max-min) shr 1);
 if center=oldcenter then
  begin
  result:=_else(AOwner,txt);
  break;
  end;
 oldcenter:=center;
 cr:=strcomp(pchar(mcall[center].cond),pchar(v));
 if cr=0 then
  begin
  result:=mcall[center].func(AOwner,txt);
  break;
  end else if cr<0 then min:=center else max:=center;
 end;
end;



procedure TForm1.FormCreate(Sender: TObject);
var i,j,min:integer;
    tmp:tcall;
begin
 setlength(mcall,4);
 mcall[0].cond:='label';
 mcall[0].func:=_label;
 mcall[1].cond:='button';
 mcall[1].func:=_button;
 mcall[2].cond:='edit';
 mcall[2].func:=_edit;
 mcall[3].cond:='panel';
 mcall[3].func:=_panel;

for i:=0 to length(mcall)-2  do
 begin
 min:=i;
 for j:=i+1 to length(mcall)-1  do
  if 0<StrComp(pchar(mcall[min].cond),pchar(mcall[j].cond)) then min:=j;
 if min<>i then
   begin
   tmp:=mcall[min];
   mcall[min]:=mcall[i];
   mcall[i]:=tmp;
   end;
 end;

end;

procedure TForm1.Button1Click(Sender: TObject);
var cmp:tcontrol;
begin
   cmp:=call(edit1.Text,form1,'Ïðóâåò');
   if cmp<>nil then
    begin
    cmp.Visible:=true;
    form1.InsertControl(cmp);
    end;
end;




--------------------
умную мысль держи при себе, а дурной - поделись с другими 
PM MAIL   Вверх
Страницы: (2) [Все] 1 2 
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0655 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.