Модераторы: 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   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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