Мастера DELPHI, Delphi programming community Рейтинг@Mail.ru Титульная страница Поиск, карта сайта Написать письмо 
| Новости |
Новости сайта
Поиск |
Поиск по лучшим сайтам о Delphi
FAQ |
Огромная база часто задаваемых вопросов и, конечно же, ответы к ним ;)
Статьи |
Подборка статей на самые разные темы. Все о DELPHI
Книги |
Новинки книжного рынка
Новости VCL
Обзор свежих компонент со всего мира, по-русски!
|
| Форумы
Здесь вы можете задать свой вопрос и наверняка получите ответ
| ЧАТ |
Место для общения :)
Орешник |
Коллекция курьезных вопросов из форумов
KOL и MCK |
KOL и MCK - Компактные программы на Delphi
Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / rsdn.org

 
Чтобы не потерять эту дискуссию, сделайте закладку « предыдущая ветвь | форум | следующая ветвь »

Скорость и "битность"


QAZ ©   (11.09.17 13:20

Сделал небольшой нуботест по скорости работы со строками
и выяснилось что скомпиленый в х64 работает в 2.5 раза медленней чем х32
это нормально???
тестил на ХЕ3 и "берлине" с {$DEFINE PUREPASCAL} и без

program Project1;
{$DEFINE PUREPASCAL}
{$APPTYPE CONSOLE}

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.


DayGaykin ©   (11.09.17 13:26[1]

Замени, для начала, Cardinal на NativeUInt


QAZ ©   (11.09.17 13:40[2]


> DayGaykin ©   (11.09.17 13:26) [1]

ничего не изменилось, что было очевидно


Eraser ©   (11.09.17 14:23[3]


> QAZ ©   (11.09.17 13:20) 

у Делфи это нормально.
там где так уж нужна и важна оптимизация надо использовать другой инструмент.


QAZ ©   (11.09.17 14:37[4]


> Eraser ©   (11.09.17 14:23) [3]

возникла гениальная(да я такой) мысль
а ведь изменение {$DEFINE PUREPASCAL} не касается уже скомпиленых модулей?
а System не перекомпиливается же и по умолчанию там вся х32 на асамблерных вставках скомпилена, потому и быстрей?
не?


rrrrrrr ©   (11.09.17 15:07[5]

не касается уже скомпиленых модулей?

касается, если билд. и если "там" твои дефайны видны.
но они же не видны;


rrrrrrr ©   (11.09.17 15:09[6]

... и если конечно вообще пас пристутствует.


QAZ ©   (11.09.17 16:59[7]


> там где так уж нужна и важна оптимизация надо использовать
> другой инструмент.

в лазарусе между битностью разница небольшая, но тормозней чем дельфи х64


Eraser ©   (11.09.17 17:44[8]


> QAZ ©   (11.09.17 14:37) [4]

беда в том, что код x32 тоже тормозной для задач, где действительно нужна скорость/оптимизация и, тем более, различные SSEx современных процессоров за последние 20 лет.


QAZ ©   (11.09.17 18:09[9]


> Eraser ©   (11.09.17 17:44) [8]

sse3 уже в 2007м делфи был
в нее же был включен код с проекта fastcode


QAZ ©   (11.09.17 18:25[10]


> rrrrrrr ©   (11.09.17 15:09) [6]

пас system присутствует, но в этих версиях никогда не компилится, даже если удалить dcu, даже не пытается, юзается только для отладки


Dimka Maslov ©   (11.09.17 19:18[11]

Если взять C++, то там 64-битное приложение выполяется на 15-20% быстрее, нежели точно такое же, но 32-битное.


rrrrrr ©   (11.09.17 19:48[12]

так я и не про сустем конкретно.
если пасы в library path
то будет компиляция


rrrrrr ©   (11.09.17 19:51[13]

плюс эти пасы могут быть в пакете и даже если нету дцу и нету пасов (или они есть) то может линковаться весь пакет через дцу самого пакета


QAZ ©   (11.09.17 19:57[14]


> rrrrrr ©   (11.09.17 19:48) [12]

все ядро работы со строками в систем, 90% кода всех программ - работа со строками
систем не перекомпилируется
так понятней?


QAZ ©   (11.09.17 19:58[15]


> Dimka Maslov ©   (11.09.17 19:18) [11]

скинь похожий нубокод для ВС ?


Дмитрий Белькевич ©   (12.09.17 22:06[16]


> 90% кода всех программ - работа со строками


Очень сильное и, к тому же, неверное заявление. Программы бывают разные.


Rouse_ ©   (12.09.17 22:58[17]

Вещи говорите правильные, но глупости выводите несуразные, вроде взрослые люди, на асм выхлоп могут глянуть компилера и выводы сделать, ан нет


QAZ ©   (14.09.17 20:02[18]


> Rouse_ ©   (12.09.17 22:58) [17]

я чо, я ничо, был бы умным не спрошал бы


tesseract ©   (04.10.17 02:04[19]

>>все ядро работы со строками в систем, 90% кода всех программ - работа со строками

Неправильно построенная система. Даже pcre работает только с указателями.


dmk ©   (06.10.17 22:31[20]

Даже не знаю что сказать. Работаю с векторами под x64 Delphi XE6.
Double немного медленнее чем Single, а в остальном оптимизация ручками дает прекрасный результат. Оптимизация в Delphi не очень. Ее почти нет :(


kilkennycat ©   (06.10.17 22:42[21]


> Ее почти нет :(

иногда это хорошо.


dmk ©   (07.10.17 12:09[22]

А вообще жесть, а не код. Прибавлять строку в цикле не самая лучшая идея.
В этом случае используется менеджер памяти 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.


Sha ©   (07.10.17 19:40[23]

> dmk ©   (07.10.17 12:09) [22]
> А вообще жесть, а не код.

У тебя тоже жесть )

После SetLength строка стала уникальной.
Зачем после этого делать ее уникальной еще 250*100000 раз?


dmk ©   (07.10.17 22:26[24]

>Зачем после этого делать ее уникальной еще 250*100000 раз?
Мне не надо. Это у автора надо спросить.
Я просто слегка оптимизировал код.


QAZ ©   (08.10.17 11:32[25]

эммм...
мой тест, это тест, на самую частую операцию со строками - конкатенацию
очевидно что вместо пробела может быть любая строка....
и собственно изначально это отчасти сравнение внутреннего МП с внешним, для WideString
за счет замены внутренего кода в самой делфи, разница между делфи7 и например ХЕ3 примерно в 10 раз для анси, в 4,5 для шорт и в 1,5 для видестрингов в пользу ХЕ3

250*100000 раз именно для того чтоб влезть в диапазон шортстринг и обеспечить идентичность теста для всех версий строк

однако именно в х64 варианте по всем вариантам падение до 3х раз, только widestring чуть быстрей чем в х32 за счет того что управляется виндой


QAZ ©   (08.10.17 11:41[26]


> tesseract ©   (04.10.17 02:04) [19]
> Неправильно построенная система. Даже pcre работает только с указателями.

эмм.. под систем я подразумевал system.pas, странно что это не очевидно, однако в плане х32 там есть огромный прорыв с 2007 версии
pcre написан на С без плюсов, с чем ему еще работать как не с указателями?


Sha ©   (08.10.17 12:53[27]

> QAZ ©   (08.10.17 11:32) [25]
> за счет замены внутренего кода в самой делфи, разница между делфи7 и например ХЕ3
> примерно в 10 раз для анси, в 4,5 для шорт и в 1,5 для видестрингов в пользу ХЕ3

разница будет поменьше, если в D7 тоже использовать FastMM4


QAZ ©   (08.10.17 13:46[28]


> Sha ©   (08.10.17 12:53) [27]

дело не в менеджере, а в move и прочих функциях из проекта fastcode заменивших старые дельфийские


Sha ©   (08.10.17 16:42[29]

одно другому помогает


версия для печати

Написать ответ

Ваше имя (регистрация  E-mail 







Разрешается использование тегов форматирования текста:
<b>жирный</b> <i>наклонный</i> <u>подчеркнутый</u>,
а для выделения текста программ, используйте <code> ... </code>
и не забывайте закрывать теги! </b></i></u></code> :)


Наверх

  Рейтинг@Mail.ru     Титульная страница Поиск, карта сайта Написать письмо