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

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> D2010 code to slow 
:(
    Опции темы
v00d00
Дата 9.3.2010, 17:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Одинаковый (почти, с учетом портирования) код скомпилированный на D7 и D2010 выполняется с разной скоростью.
Имеется сложная структура классов с частым вызовом виртаульных функций.
Тормоза замеченны в отдельной BPL, в ней происходит интенсиваная работа со строками.
Доходит до того, что одни и теже последовательности вызовов могут выполняться до 10 раз дольше.

Еще немного подробностей. Профайлер для кода на д7 показывает что идет вызов метода Merge#1 т.е. вызывается первая перегрузка в юните. Для D2010 вызывается Merge#3. Приблуды компилятора?

Как думаете, можно ли решить проблему настройкой компилятора? Были ли у кого-нибудь такого рода проблемы при миграции?

Хех, сфейлил в названии темы.


Это сообщение отредактировал(а) v00d00 - 9.3.2010, 18:02
PM MAIL   Вверх
Matematik
Дата 9.3.2010, 18:34 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Первое что приходит наум:

1. оптимизация кода работы со строками
например, не делать так
Код

Str1 := 'очень длинная строка';
for i:=1 to Length(Str1) do
  Str2 := Str2 + Str1[i] + ',';


2. работа с UnicodeString медленне чем с AnsiString

3. в Release версии отключить "Range checking"

.. 
PM MAIL WWW ICQ   Вверх
bems
Дата 9.3.2010, 19:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

Репутация: 31
Всего: 88



Цитата(Matematik @  9.3.2010,  18:34 Найти цитируемый пост)
1. оптимизация кода работы со строками
например, не делать так
    
Str1 := 'очень длинная строка';
for i:=1 to Length(Str1) do
  Str2 := Str2 + Str1[i] + ',';

Очень бы хотелось чтобы это работало быстро. Это же уже автоматически пишется. Вроде менеждер памяти с запасом выделяет...
Может у ТС много неявных конвертаций уникод-анси-уникод?



--------------------
Обижено школьников: 8
PM MAIL   Вверх
v00d00
Дата 23.3.2010, 10:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


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

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



Старобамп

Выяснилось что львиная доля замедления была связана с багом, из-за которго одна и та же операция выполнялась 10 раз, на его фиксе мы выиграли 500 мс. Но на этом наши изыскания не закончились.

Так сложилось, что 90 процентов процессорного времени съедают Locata и Lookup вызовы. И видимо в силу кривости нашей программы, не редко случается ситуация когда Locate вызывается для записи на которой уже стоит курсор в данный момент.

Самое интересное, что нехитрой манипуляцией, с перегрузкой метода удалось на 25% ускорить работу системы в целом.

Вот код.

Код


function TSHClientDataSet.Lookup(const KeyFields: string; const KeyValues: Variant;
  const ResultFields: string): Variant;
var
  LEqual : boolean;
begin

  Result := Null;
  LEqual := SameRecord(KeyValues, KeyFields);

  if  LEqual then
    Result := FieldValues[ResultFields]
  else
  if LocateRecord(KeyFields, KeyValues, [], False) then
  begin
    SetTempState(dsCalcFields);
    try
      CalculateFields(TempBuffer);
      Result := FieldValues[ResultFields];
    finally
      RestoreState(dsBrowse);
    end;
  end;
end;

function TSHClientDataSet.Locate(const KeyFields: string;
  const KeyValues: Variant; Options: TLocateOptions): Boolean;
var
  LEqual : boolean;
begin
    LEqual := SameRecord(KeyValues,KeyFields);
    if LEqual then
    begin
      Result := true;
    end
    else
    begin
      DoBeforeScroll;
      Result := LocateRecord(KeyFields, KeyValues, Options, True);
      if Result then
      begin
        Resync([rmExact, rmCenter]);
        DoAfterScroll;
      end;
    end;
end;

function TSHClientDataSet.SameRecord(const AKeyValues: Variant; const AKeyFields: string):boolean;
var
  I: Integer;
  LValue: Variant;
  LCount: Integer;
  LSearchArr: Variant;
begin
  try
    LSearchArr := FieldValues[AKeyFields];
    if VarIsArray(LSearchArr) then
    begin
      LCount := VarArrayHighBound(LSearchArr, 1);
      Result := true;
      for i := 0 to LCount - 1 do
      begin
        Result := Result and VarSameValue(LSearchArr[i], AKeyValues[i]);
        if not Result then
          break;
      end;
    end
    else
      Result := VarSameValue(LSearchArr, AKeyValues);
  except
    Result := false;
  end;
end;
 

Я хлеб, и поэтому наверняка эту логику можно ускорить еще немного. Счет идет на микросекунды, т.к. за время загрузки документа вызвается порядка 5000 лукап-локейтов... Если есть идеи по ускорению, прошу подскажите.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

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

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

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

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


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

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


 




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


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

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