Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > D2010 code to slow


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

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

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

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

Автор: Matematik 9.3.2010, 18:34
Первое что приходит наум:

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

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


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

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

.. 

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

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

Автор: v00d00 23.3.2010, 10:57
Старобамп

Выяснилось что львиная доля замедления была связана с багом, из-за которго одна и та же операция выполнялась 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 лукап-локейтов... Если есть идеи по ускорению, прошу подскажите.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)