• TUser © (29.01.05 16:49) [0]
    Почему он во FP работает медленнее, чем в Delphi, и можно ли это как-нибудь ускорить? Конкретно есть такой код
     S1:=TStringList.Create;
     S2:=TStringList.Create;
     try    
      for i:=0 to length(Ds)-1 do
        try
         S1.Clear; S2.Clear;
         S1.LoadFromFile(ExtractFilePath(ParamStr(0))+'pdb'+Ds[i].AC+'.ent');
         for j:=0 to S1.Count-1 do
           if IsInDomain(S1[j],Ds[i]) then
             if not (copy(S1[j],1,6) = 'ENDMDL') then
               S2.Add(S1[j])
               else begin
               inc (c);
               raise Exception.Create('');
               end;
         S2.SaveToFile(ExtractFilePath(ParamStr(0))+Ds[i].AC+'.ent');  
         inc (c);
        except            
        end;
     finally
      S1.Free;
      S2.Free;
     end;


    В Delphi работает существенно (на пару порядков, наверное) быстрее, чем в FP.
  • tero (31.01.05 01:33) [1]
    Интересно, а что он должен делать?

    Не знаю, вроде что-то оптимизировал:
    procedure SomeOperations;
    begin
       try
        S1.LoadFromFile(fullpath+'pdb'+str); // <--

        for j:=0 to S1.Count-1 do
          if IsInDomain(S1[j],Ds[i]) then
            if (copy(S1[j],1,6) <> 'ENDMDL') then
              S2.Add(S1[j])
            else
            begin
              inc (c);
    {??}       raise Exception.Create('');
            end;

        S2.SaveToFile(fullpath+str); // <--
        inc (c);
       except
       end;
    end;

    ...

    fullpath := ExtractFilePath(ParamStr(0)); // <--

    try
     S1:=TStringList.Create;
     S2:=TStringList.Create;

     for i:=0 to length(Ds)-1 do
     begin
       str := Ds[i].AC+'.ent'; // <--
       S1.Clear; S2.Clear;

       SomeOperations;
     end;
    finally
     S1.Free;
     S2.Free;
    end;



    Сокращай в цикле как можно больше лишних операций. Инвариантный код выноси за пределы цикла.
  • KA_ © (31.01.05 09:55) [2]
    Для S1 не надо вызывать Clear.
    При загрузке из файла содержимое все равно очистится.
  • TUser © (31.01.05 11:17) [3]
    За советы спсибо, хотя вопрос, вообщем-то не про это. Лишее выполнение ExtractFilePath занимает копейки времени, равно как и Clear. Но после dcc32 программа работает очень существенно быстрее, чем после fpc.

    > Интересно, а что он должен делать?

    Загрузить один файл в StringList, просмотреть все строчки, если строка удвлетворяет некоторому условию, - скопировать ее в другой StringList, записать результат в файл. И так в цикле для нескольких файлов.
    Да он, вобщем-то и делает то, что надо, только медленно, как будто readln/writeln используется.
  • KA_ © (01.02.05 09:33) [4]
    "Почему" - не тот вопрос :) Врядли здесь обитают большие знатоки компиляторов, чтоб на него ответить.
    Вопрос наверное надо ставить так - "как решить эту проблему".
    Я недавно задавал здесь вопрос про профайлеры для FPC, но ответа не получил. И поиск в интернете ничего не дал :(
    А без профайлера здесь тяжело судить. Попробуй замерить время исполнения отдельных частей этого кода дедовским методом - GetTickCount :) А когда выяснишь, что конкретно тормозит, можно искать пути решения.
  • PVOzerski © (01.02.05 10:14) [5]
    Так, догадка... А не мается ли компилятор переделкой длинных строк в короткие и обратно? {$H+} включено?
  • TUser © (01.02.05 13:35) [6]

    > PVOzerski ©   (01.02.05 10:14) [5]  

    Включено.
  • PVOzerski © (01.02.05 15:04) [7]
    А в юните classes тоже включено?
  • TUser © (02.02.05 15:16) [8]
    Да, так без него будет Необъявленный Индентификатор (TStringList) по крайней мере в dcc32. Во FP, вроде бы, - тоже.
  • TUser © (04.02.05 11:05) [9]
    Совсем в тупик меня заводит то, что обнаружить существенных отличий в реализации класса TStringList для Delphi и FPC (1.9) я не смог.
  • TUser © (04.02.05 11:26) [10]
    Вот тестовый пример. Загнял в него текстовый файл размером 3 метра
    после компиляции dcc32 - 0 секунд, т.е. мгновенно
    после компиляции fpc (1.9) - около 200 секунд
    Опция $H+ не спасает

    {$ifdef fpc}
    {$mode delphi}
    {$H+}
    {$endif}

    program SLTest;

    {$ifndef fpc}
    {$apptype console}
    {$endif}
    uses Classes, SysUtils, DateUtils;

    var S: string;
       SL: TStringList;
       T: TDateTime;

    begin
     if ParamCount > 0 then
       S:=ParamStr(1)
       else begin
       write('Enter a file name: ');
       readln(S);
       end;

     T:=now;
     SL:=TStringLIst.Create;
     try
      SL.LoadFromFile(S);
     finally
      SL.Free;
     end;

     writeln(inttostr(SecondsBetween(T,now))+' seconds for a work');
    end.

  • PVOzerski © (04.02.05 13:33) [11]
    Мне, честно говоря, сейчас просто некогда заниматься, хотя жаль. Знаешь, а почему бы тебе не написать на официальный mailing list разработчиков FreePascal? fpc-devel@lists.freepascal.org
  • TUser © (04.02.05 14:03) [12]
    Спасибо, написал.
  • Yhrik (11.02.05 07:56) [13]
    TUser на FP если не принципиально, попробуй на Virtual Pascal www.vpascal.org
    работает быстро
    (now-T)=5,6e-6 на 18'843 Кб
  • Yhrik © (11.02.05 11:08) [14]
    Облажался www.vpascal.com конечно.
  • thaddy (11.02.05 14:13) [15]
    Use Capacity property = Filesize to speed up FP version
    then example is also 0 after compilation
  • PVOzerski © (21.02.05 12:03) [16]
    2TUser ©   (04.02.05 14:03) [12]:
    Сегодня по рассылке пришел ответ: хорошо бы проверить на последнем билде. Возможно, проблема уже решена.
  • TUser © (21.02.05 17:14) [17]
    Да, так и есть. Мне сегодня ответ пришел от разработчиков, проверил - в новой версии все быстро.
  • имя (31.03.09 13:02) [18]
    Удалено модератором
  • имя (31.03.09 13:05) [19]
    Удалено модератором
  • имя (31.03.09 13:06) [20]
    Удалено модератором
Есть новые Нет новых   [118613   +60][b:0][p:0.002]