-
Сделал небольшой нуботест по скорости работы со строками
и выяснилось что скомпиленый в х64 работает в 2.5 раза медленней чем х32
это нормально???
тестил на ХЕ3 и "берлине" с {$DEFINE PUREPASCAL} и без
program Project1;
uses
windows;
var
a:ansistring;
r:rawbytestring;
u:unicodestring;
w:widestring;
s:shortstring;
i,j,x,t:cardinal;
begin
s:='This is a test';
t:=GetTickCount;
for i:=0 to 100000 do begin
s:=' ';
for j := 0 to 250 do begin
s:=s+' ';
end;
end;
x:= GetTickCount-t;
writeln('shortstring=',x);
a:='This is a test';
t:=GetTickCount;
for i:=0 to 100000 do begin
a:=' ';
for j := 0 to 250 do begin
a:=a+' ';
end;
end;
x:= GetTickCount-t;
writeln('ansistring=',x);
r:='This is a test';
t:=GetTickCount;
for i:=0 to 100000 do begin
r:=' ';
for j := 0 to 250 do begin
r:=r+' ';
end;
end;
x:= GetTickCount-t;
writeln('rawbytestring=',x);
u:='This is a test';
t:=GetTickCount;
for i:=0 to 100000 do begin
u:=' ';
for j := 0 to 250 do begin
u:=u+' ';
end;
end;
x:= GetTickCount-t;
writeln('unicodestring=',x);
w:='This is a test';
t:=GetTickCount;
for i:=0 to 100000 do begin
w:=' ';
for j := 0 to 250 do begin
w:=w+' ';
end;
end;
x:= GetTickCount-t;
writeln('widestring=',x);
Readln;
end.
-
Замени, для начала, Cardinal на NativeUInt
-
> DayGaykin © (11.09.17 13:26) [1]
ничего не изменилось, что было очевидно
-
> QAZ © (11.09.17 13:20)
у Делфи это нормально.
там где так уж нужна и важна оптимизация надо использовать другой инструмент.
-
> Eraser © (11.09.17 14:23) [3]
возникла гениальная(да я такой) мысль
а ведь изменение {$DEFINE PUREPASCAL} не касается уже скомпиленых модулей?
а System не перекомпиливается же и по умолчанию там вся х32 на асамблерных вставках скомпилена, потому и быстрей?
не?
-
не касается уже скомпиленых модулей?
касается, если билд. и если "там" твои дефайны видны.
но они же не видны;
-
... и если конечно вообще пас пристутствует.
-
> там где так уж нужна и важна оптимизация надо использовать
> другой инструмент.
в лазарусе между битностью разница небольшая, но тормозней чем дельфи х64
-
> QAZ © (11.09.17 14:37) [4]
беда в том, что код x32 тоже тормозной для задач, где действительно нужна скорость/оптимизация и, тем более, различные SSEx современных процессоров за последние 20 лет.
-
> Eraser © (11.09.17 17:44) [8]
sse3 уже в 2007м делфи был
в нее же был включен код с проекта fastcode
-
> rrrrrrr © (11.09.17 15:09) [6]
пас system присутствует, но в этих версиях никогда не компилится, даже если удалить dcu, даже не пытается, юзается только для отладки
-
Если взять C++, то там 64-битное приложение выполяется на 15-20% быстрее, нежели точно такое же, но 32-битное.
-
так я и не про сустем конкретно.
если пасы в library path
то будет компиляция
-
плюс эти пасы могут быть в пакете и даже если нету дцу и нету пасов (или они есть) то может линковаться весь пакет через дцу самого пакета
-
> rrrrrr © (11.09.17 19:48) [12]
все ядро работы со строками в систем, 90% кода всех программ - работа со строками
систем не перекомпилируется
так понятней?
-
> Dimka Maslov © (11.09.17 19:18) [11]
скинь похожий нубокод для ВС ?
-
> 90% кода всех программ - работа со строками
Очень сильное и, к тому же, неверное заявление. Программы бывают разные.
-
Вещи говорите правильные, но глупости выводите несуразные, вроде взрослые люди, на асм выхлоп могут глянуть компилера и выводы сделать, ан нет
-
> Rouse_ © (12.09.17 22:58) [17]
я чо, я ничо, был бы умным не спрошал бы
-
>>все ядро работы со строками в систем, 90% кода всех программ - работа со строками
Неправильно построенная система. Даже pcre работает только с указателями.
-
Даже не знаю что сказать. Работаю с векторами под x64 Delphi XE6.
Double немного медленнее чем Single, а в остальном оптимизация ручками дает прекрасный результат. Оптимизация в Delphi не очень. Ее почти нет :(
-
> Ее почти нет :(
иногда это хорошо.
-
А вообще жесть, а не код. Прибавлять строку в цикле не самая лучшая идея.
В этом случае используется менеджер памяти Delphi, что тормозит процесс.
Поставьте размер строки сразу на максимум.
Ваш код – x32: 333 миллисекунды,
мой – x32: 78 мс, x64: 109 мс.
program AnsiStr;
{$APPTYPE CONSOLE}
{$R *.res}
uses
System.SysUtils, Winapi.Windows;
var
A: AnsiString;
T, X: DWord;
i, j: Integer;
begin
try
{ TODO -oUser -cConsole Main : Insert code here }
A := 'This is a test';
T := GetTickCount;
SetLength(A, 250);
for i := 0 to 99999 do
for j := 0 to 249 do A[j] := #32;
X := (GetTickCount - T);
Writeln('Ansistring = ', X);
Readln;
except
on E: Exception do
Writeln(E.ClassName, ': ', E.Message);
end;
end.
-
> dmk © (07.10.17 12:09) [22]
> А вообще жесть, а не код.
У тебя тоже жесть )
После SetLength строка стала уникальной.
Зачем после этого делать ее уникальной еще 250*100000 раз?
-
>Зачем после этого делать ее уникальной еще 250*100000 раз?
Мне не надо. Это у автора надо спросить.
Я просто слегка оптимизировал код.
-
эммм...
мой тест, это тест, на самую частую операцию со строками - конкатенацию
очевидно что вместо пробела может быть любая строка....
и собственно изначально это отчасти сравнение внутреннего МП с внешним, для WideString
за счет замены внутренего кода в самой делфи, разница между делфи7 и например ХЕ3 примерно в 10 раз для анси, в 4,5 для шорт и в 1,5 для видестрингов в пользу ХЕ3
250*100000 раз именно для того чтоб влезть в диапазон шортстринг и обеспечить идентичность теста для всех версий строк
однако именно в х64 варианте по всем вариантам падение до 3х раз, только widestring чуть быстрей чем в х32 за счет того что управляется виндой
-
> tesseract © (04.10.17 02:04) [19]
> Неправильно построенная система. Даже pcre работает только с указателями.
эмм.. под систем я подразумевал system.pas, странно что это не очевидно, однако в плане х32 там есть огромный прорыв с 2007 версии
pcre написан на С без плюсов, с чем ему еще работать как не с указателями?
-
> QAZ © (08.10.17 11:32) [25]
> за счет замены внутренего кода в самой делфи, разница между делфи7 и например ХЕ3
> примерно в 10 раз для анси, в 4,5 для шорт и в 1,5 для видестрингов в пользу ХЕ3
разница будет поменьше, если в D7 тоже использовать FastMM4
-
> Sha © (08.10.17 12:53) [27]
дело не в менеджере, а в move и прочих функциях из проекта fastcode заменивших старые дельфийские
-
одно другому помогает