-
Почему он во 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.
-
Интересно, а что он должен делать? Не знаю, вроде что-то оптимизировал: 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; Сокращай в цикле как можно больше лишних операций. Инвариантный код выноси за пределы цикла.
-
Для S1 не надо вызывать Clear. При загрузке из файла содержимое все равно очистится.
-
За советы спсибо, хотя вопрос, вообщем-то не про это. Лишее выполнение ExtractFilePath занимает копейки времени, равно как и Clear. Но после dcc32 программа работает очень существенно быстрее, чем после fpc.
> Интересно, а что он должен делать? Загрузить один файл в StringList, просмотреть все строчки, если строка удвлетворяет некоторому условию, - скопировать ее в другой StringList, записать результат в файл. И так в цикле для нескольких файлов. Да он, вобщем-то и делает то, что надо, только медленно, как будто readln/writeln используется.
-
"Почему" - не тот вопрос :) Врядли здесь обитают большие знатоки компиляторов, чтоб на него ответить. Вопрос наверное надо ставить так - "как решить эту проблему". Я недавно задавал здесь вопрос про профайлеры для FPC, но ответа не получил. И поиск в интернете ничего не дал :( А без профайлера здесь тяжело судить. Попробуй замерить время исполнения отдельных частей этого кода дедовским методом - GetTickCount :) А когда выяснишь, что конкретно тормозит, можно искать пути решения.
-
Так, догадка... А не мается ли компилятор переделкой длинных строк в короткие и обратно? {$H+} включено?
-
> PVOzerski © (01.02.05 10:14) [5] Включено.
-
А в юните classes тоже включено?
-
Да, так без него будет Необъявленный Индентификатор (TStringList) по крайней мере в dcc32. Во FP, вроде бы, - тоже.
-
Совсем в тупик меня заводит то, что обнаружить существенных отличий в реализации класса TStringList для Delphi и FPC (1.9) я не смог.
-
Вот тестовый пример. Загнял в него текстовый файл размером 3 метра после компиляции dcc32 - 0 секунд, т.е. мгновенно после компиляции fpc (1.9) - около 200 секунд Опция $H+ не спасает
program SLTest;
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.
-
Мне, честно говоря, сейчас просто некогда заниматься, хотя жаль. Знаешь, а почему бы тебе не написать на официальный mailing list разработчиков FreePascal? fpc-devel@lists.freepascal.org
-
Спасибо, написал.
-
TUser на FP если не принципиально, попробуй на Virtual Pascal www.vpascal.org работает быстро (now-T)=5,6e-6 на 18'843 Кб
-
Облажался www.vpascal.com конечно.
-
Use Capacity property = Filesize to speed up FP version then example is also 0 after compilation
-
2TUser © (04.02.05 14:03) [12]: Сегодня по рассылке пришел ответ: хорошо бы проверить на последнем билде. Возможно, проблема уже решена.
-
Да, так и есть. Мне сегодня ответ пришел от разработчиков, проверил - в новой версии все быстро.
-
Удалено модератором
-
Удалено модератором
-
Удалено модератором
|