Конференция "Прочее" » Скорость и "битность"
 
  • QAZ © (11.09.17 13:20) [0]
    Сделал небольшой нуботест по скорости работы со строками
    и выяснилось что скомпиленый в х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]
    одно другому помогает
 
Конференция "Прочее" » Скорость и "битность"
Есть новые Нет новых   [118671   +60][b:0][p:0.002]