Re: 32 bit
От: пффф  
Дата: 11.03.23 07:47
Оценка: +4 :)
Здравствуйте, eustin, Вы писали:

E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.



А нафига нужны 64 бита? Имхо, если они в чем-то реально полезны — тогда переходить, а иначе какой смысл?
Re[17]: 32 bit
От: Sharov Россия  
Дата: 17.03.23 14:28
Оценка: -2 :))
Здравствуйте, Евгений Музыченко, Вы писали:

S>>Для отладочный версии компилятор может генерировать не самый оптимальный код

ЕМ>Запуск под отладчиком не имеет никакого отношения к генерации кода.

Под отладчиком, если без лишний действий, будет запускаться отладочная версия, т.е. не
самая оптимальная.
Кодом людям нужно помогать!
Re: 32 bit
От: Черный 😈 Властелин Австралия https://www.softperfect.com
Дата: 11.03.23 09:18
Оценка: 45 (3)
Здравствуйте, eustin, Вы писали:
E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.

Я недавно приделал учет активаций, который также рапортует версии системы — 32 бита это где-то 1 из 50 пользователей.

Зато среди пиратов (это видно в моей системе) их хоть жопой жуй, в основном из всяких нищих стран.

Планирую выкинуть 32-битные версии в ближайшее время и вместо них добавить aarch64.
Re[2]: 32 bit
От: eustin  
Дата: 11.03.23 08:48
Оценка: +2
П>А нафига нужны 64 бита? Имхо, если они в чем-то реально полезны — тогда переходить, а иначе какой смысл?
— памяти не хватает тупо
— новые либы все предсобраны под 64, чтобы не собирать их под 32
Re[6]: 32 bit
От: rudzuk  
Дата: 14.03.23 18:40
Оценка: +2
Здравствуйте, Философ, Вы писали:

Ф> Занимательные результаты, правда!? Конечно же инкремент int64 в x86 медленнее чем int32 — это логично. Но, во-первых код под x64 прям заметно медленнее, а во-вторых даже на x64 инкремент int64 в x86 медленнее чем int32. Притом существенно медленнее!!!

Ф> Процессор-то не так прост оказывается..

Этот ваш дотнет — ненастоящий. Вот другие результаты:


Код: (увеличил количество итераций в 10 раз, время в миллисекундах)
program Project1;

uses
  SysUtils;

const
  Iterations = 100 * 1000 * 1000;

generic procedure TestSpeedIntX<IntX>;
var
  a,b,c,d,e,f,g,h : IntX;
  SmallArray : array[0..7] of IntX;
  VariablesIncrementTime, ArrayItemIncrementTime : Cardinal;
  i : NativeInt;
begin
  a := 0;
  b := 0;
  c := 0;
  d := 0;
  e := 0;
  f := 0;
  g := 0;
  h := 0;
  VariablesIncrementTime := GetTickCount;
  for i := 1 to Iterations do
    begin
      Inc(a);
      Inc(b);
      Inc(c);
      Inc(d);
      Inc(e);
      Inc(f);
      Inc(g);
      Inc(h);
    end;
  VariablesIncrementTime := GetTickCount - VariablesIncrementTime;

  ArrayItemIncrementTime := GetTickCount;
  for i := 1 to Iterations do
    begin
      Inc(SmallArray[0]);
      Inc(SmallArray[1]);
      Inc(SmallArray[2]);
      Inc(SmallArray[3]);
      Inc(SmallArray[4]);
      Inc(SmallArray[5]);
      Inc(SmallArray[6]);
      Inc(SmallArray[7]);
    end;
  ArrayItemIncrementTime := GetTickCount - ArrayItemIncrementTime;

  WriteLn('elapsed for variable = ', VariablesIncrementTime, ' array = ', ArrayItemIncrementTime);
end;

var
  i : NativeInt;
begin
  WriteLn;
  WriteLn({$INCLUDE %FPCTARGETOS%}, ' ', {$INCLUDE %FPCTARGETCPU%}, ' (Free Pascal ', {$INCLUDE %FPCVERSION%}, ')');
  WriteLn('test speed for 32');
  for i := 1 to 10 do
    specialize TestSpeedIntX<Int32>;

  WriteLn('test speed for 64');
  for i := 1 to 10 do
    specialize TestSpeedIntX<Int64>;
end.
avalon/3.0.2
Re[11]: 32 bit
От: rudzuk  
Дата: 14.03.23 21:29
Оценка: :))
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ> TW>Может паскалевские замарочки?


ЕМ> Скорее всего. В сях при таких тестах тоже надо следить, чтоб шибко умный компилятор не наоптимизировал. Даже древний VC++ конца 90-х много чего умеет.


Я попробовал этот тест собрать паскалем с llvm, так он вообще весь код выкинул за ненадобностью
avalon/3.0.2
Re[10]: 32 bit
От: Aquilaware  
Дата: 14.03.23 23:57
Оценка: :))
Здравствуйте, Евгений Музыченко, Вы писали:

A>>У вас такая уверенность в вашей исключительности

ЕМ>Определенная исключительность наличествует во многих. Но таки интересно, из чего именно Вы делаете такой вывод?

Потому что вы не умеете входить в ситуации окружающих людей (эгоизм). Например, если вам достаточно 300 Кб для программы, вы делаете вывод что всему миру этого обьема тоже достаточно и начинаете методично разьяснять почему это так и никак иначе для всех и на все времена (контрпродуктивный нигилизм с элементами нарцисизма). Такие дисскуссии даже продолжать не хочеться, потому что они говорят как минимум об элементах незрелости и недальновидности. При этом изначально тема дискуссии была про применимость 64 битных архитектур, но после ваших сообщений происходит мастерский дерейлинг всей ветки. И это не первая и, скорее всего, не последняя тема, в которой всё развивается по одному и тому же патологическому сценарию резонёрства.

Не обижайтесь если я что-то не так написал. Вы спросили — я ответил. Надеюсь это информация для вас будет в конечном итоге полезна, даже если она вызовет разнонаправленные сиюминутные эмоции.
Re[4]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.03.23 12:39
Оценка: 8 (1)
Здравствуйте, Философ, Вы писали:

Ф>Зачем миллионы? Достаточно одного объекта в куче, у которого пара булевых полей, пара интовых, а ещё несколького геттеров, несколько сеттеров и один vtable. Сам посчитай оверхед.


У одного такого объекта оверхед будет десяток-другой байтов, это критично?

Ф>Собственно, чем больше объектов тем меньше оверхед.


Почему меньше? Он постоянный на каждый объект.

Ф>Но даже если их очень много, в этом примере оверхед значительный.


Вот он и становится заметным, только когда таких объектов очень много. Впрочем, на фоне современных браузеров почти любой оверхед уже выглядит незначительным. У них тоже начиналось с "ну ладно, пусть страница занимает на 100 килобайт больше, зато навигация будет быстрее". А теперь — "вроде бы эти 20 мегабайт тут лишние, да и хрен с ними, щас прикрутим еще какую-нибудь свистоперделку".


ЕМ>>все общение с системой идет через трансляцию.


Ф>где об этом можно почитать?


Если про винду, то гуглите по WOW64. Собственно, то же самое происходит и при запуске 16-разрядного кода в 32-разрядной винде.

Ф>Почему при нативных вызовах такого не происходит?


Основной обрабатывающий код реализован в родной разрядности. Дублировать его полностью нецелесообразно, хотя многие мелкие функции полностью отрабатывают в 32-разрядных библиотеках. А когда функция требует обращения к ядру, желательно унифицировать интерфейс, чтобы ядру не приходилось разбираться с разрядностью указателей. Поэтому вся трансляция делается в библиотеках пользовательского режима (DLL в винде), а в ядро уже идут только стандартные, "родные" запросы.
Re[9]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.03.23 20:12
Оценка: 8 (1)
Здравствуйте, Философ, Вы писали:

Ф>Я не плюсовик и настройка проекта для меня не секундное дело


Грешно для такой мелочи создавать проект. Достаточно положить текст в файл .cpp, открыть консоль, вызвать командный файл настройки окружения (например, в VS 2019 это C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvarsall.bat) с параметром x86 или x64, и потом дать команду cl file.cpp. Оно само скомпилирует и соберет в EXE.
Re[8]: 32 bit
От: rudzuk  
Дата: 14.03.23 19:10
Оценка: 2 (1)
Здравствуйте, TailWind, Вы писали:

TW> Надо бы ещё в 10 раз увеличить

TW> А то больно 16 мс погрешность gettckcount вылезает

avalon/3.0.2
Re: 32 bit
От: Sharowarsheg  
Дата: 11.03.23 06:15
Оценка: +1
Здравствуйте, eustin, Вы писали:

E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.


Я примерно в 2019 перешёл. Если ты спрашиваешь моего разрешения, то да, можно.
Re[3]: 32 bit
От: пффф  
Дата: 11.03.23 08:50
Оценка: +1
Здравствуйте, JustPassingBy, Вы писали:

П>>А нафига нужны 64 бита? Имхо, если они в чем-то реально полезны — тогда переходить, а иначе какой смысл?


JPB>Эстетика. Может быть плагины какие-то только под 64 бита, или полтитка безопасности в среде, где это устанавливается, позволяет только 64.


Ну, это уже реальные причины, как ни крути. Просто переходить на 64 бита, чтобы было, я лично не вижу смысла
Re[3]: 32 bit
От: пффф  
Дата: 11.03.23 08:52
Оценка: +1
Здравствуйте, eustin, Вы писали:

П>>А нафига нужны 64 бита? Имхо, если они в чем-то реально полезны — тогда переходить, а иначе какой смысл?

E>- памяти не хватает тупо
E>- новые либы все предсобраны под 64, чтобы не собирать их под 32

Ну, это тоже вполне реальные причины. Хотя я как-то не сталкивался с либами, предсобранными только для x64. Да и проблем с памятью никогда не было
Re[2]: 32 bit
От: TailWind  
Дата: 13.03.23 12:15
Оценка: +1
V>- 64-битные указатели требуют больше памяти. Это увеличивает объем занимаемой приложениями оперативной памяти.
А значит меньше программы влезет в кэш процессора

Но эмуляция арифметических 64-бит операций в 32-битной программе будет, конечно, медленней чем нативные 64-бит
Re[4]: 32 bit
От: Aquilaware  
Дата: 13.03.23 23:59
Оценка: -1
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Для типичного приложения такая ситуация нереальна.


Знаменитые "640 килобайт хватит всем".
Re[10]: 32 bit
От: Marty Пират https://www.youtube.com/channel/UChp5PpQ6T4-93HbNF-8vSYg
Дата: 14.03.23 20:23
Оценка: :)
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Грешно для такой мелочи создавать проект. Достаточно положить текст в файл .cpp, открыть консоль, вызвать командный файл настройки окружения (например, в VS 2019 это C:\Program Files (x86)\Microsoft Visual Studio\2019\Professional\VC\Auxiliary\Build\vcvarsall.bat) с параметром x86 или x64, и потом дать команду cl file.cpp. Оно само скомпилирует и соберет в EXE.


Фу, сколько телодвижений. У меня для такого cxx03.bat/cxx11.bat/cxx14.bat/cxx17.bat в путях лежат
Маньяк Робокряк колесит по городу
Re[12]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.03.23 21:39
Оценка: +1
Здравствуйте, rudzuk, Вы писали:

R>Я попробовал этот тест собрать паскалем с llvm, так он вообще весь код выкинул за ненадобностью


Вот и в сишном приходится добавлять код использования тестовых массивов, а результат передавать куда-нибудь наружу, иначе тоже выкидывает. А если по массиву проходить в цикле, эта гадина еще и инварианты находит и выносит из цикла.
Re[12]: 32 bit
От: rudzuk  
Дата: 14.03.23 22:47
Оценка: +1
Здравствуйте, Философ, Вы писали:

Ф> Ага, я видел. Только при этом ты на полном серьёзе утверждаешь, что этот наш .net не настоящий. Да-да, медленный слишком.


А ты сам не видишь дичь в результатах своих замеров? 64-битный код с треском сливает 32-битному, работая в родном для себя режиме. И это объясняется тем, что процессор, оказывается, не так прост. фасепальм.

Ф> R>Что есть у нас в паскале я знаю. Код написан именно так, чтобы любой мог его собрать без установки подополнительных пакетов.


Ф> В таких случаях самостоятельно дергают QPC. Некоторые извращенцы при этом даже из .net дёргают RDTSC, например вот здесь Сидиристый поступил именно так.


Как я уже говорил, смысла в этом не много Задачи ловить такты нет. Вот смотри, специально для тебя:

const
  Iterations = 10 * 1000 * 1000;

function GetTickCount : Int64;
begin
  if not QueryPerformanceCounter(@Result) then
    System.Error(reAssertionFailed);
end;


Результат:


Ну, сильно изменился общий результат?
avalon/3.0.2
Re[12]: 32 bit
От: Sharowarsheg  
Дата: 15.03.23 09:55
Оценка: +1
Здравствуйте, rudzuk, Вы писали:

R>Я попробовал этот тест собрать паскалем с llvm, так он вообще весь код выкинул за ненадобностью


Статья "о ценности синтетических бенчмарков"
Re: 32 bit
От: T4r4sB Россия  
Дата: 17.03.23 18:31
Оценка: +1
Здравствуйте, eustin, Вы писали:

E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.


Да, но зачем? 32 бита жрут меньше памяти, и более портируемые.
64 бита нужны только если 4 гигов мало.
32 bit
От: eustin  
Дата: 11.03.23 05:18
Оценка:
Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.
Re: 32 bit
От: Khimik  
Дата: 11.03.23 06:17
Оценка:
Здравствуйте, eustin, Вы писали:

E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.


Я кажется слышал, что Wine для Linux или Mac лучше работает с Win32 версиями. Если кто-то знает конкретнее, прошу написать.
"Ты должен сделать добро из зла, потому что его больше не из чего сделать". АБ Стругацкие.
Re[2]: 32 bit
От: JustPassingBy  
Дата: 11.03.23 08:42
Оценка:
Здравствуйте, пффф, Вы писали:

П>А нафига нужны 64 бита? Имхо, если они в чем-то реально полезны — тогда переходить, а иначе какой смысл?


Эстетика. Может быть плагины какие-то только под 64 бита, или полтитка безопасности в среде, где это устанавливается, позволяет только 64.
Re[2]: 32 bit
От: eustin  
Дата: 11.03.23 09:25
Оценка:
спасибо!
Re: 32 bit
От: Chaser81 Россия https://delphisources.ru/
Дата: 11.03.23 10:39
Оценка:
Здравствуйте, eustin, Вы писали:

E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.


У меня процентов 10% качают 32 битные версии, остальные 90% — 64.
Поэтому т.к. сложностей с компиляцией под 32-бит нет, то пока от 32 не отказался.
SiteAnalyzer — https://site-analyzer.ru/ — технический аудит сайта
Re[2]: 32 bit
От: Sharowarsheg  
Дата: 11.03.23 15:17
Оценка:
Здравствуйте, пффф, Вы писали:

E>>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.


П>А нафига нужны 64 бита? Имхо, если они в чем-то реально полезны — тогда переходить, а иначе какой смысл?


Памяти может быть нужно, например.
Re[2]: 32 bit
От: Aquilaware  
Дата: 11.03.23 15:45
Оценка:
Здравствуйте, пффф, Вы писали:

П>А нафига нужны 64 бита? Имхо, если они в чем-то реально полезны — тогда переходить, а иначе какой смысл?


Когда-то мне понадобилось выделить 80 Мб непрерывной памяти — но на 32 битных системах это часто не срабатывало из-за фрагментации памяти. Вроде как теоретические 4 Гб для 32 бит и доступны, но из них иногда даже относительно скромные 80 Мб одним блоком выделить не получается, потому что в адресном пространстве иногда не бывает достаточно продолжительной свободной "дырки".

64 бита решают эту проблему.
Отредактировано 11.03.2023 15:49 Aquilaware . Предыдущая версия . Еще …
Отредактировано 11.03.2023 15:46 Aquilaware . Предыдущая версия .
Отредактировано 11.03.2023 15:46 Aquilaware . Предыдущая версия .
Отредактировано 11.03.2023 15:45 Aquilaware . Предыдущая версия .
Re: 32 bit
От: wantus  
Дата: 11.03.23 23:32
Оценка:
Здравствуйте, eustin, Вы писали:

E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.


За последнюю неделю 0.6% активных инсталлов — 32-битные. Остальные — 64-битные.
Re[2]: 32 bit
От: eustin  
Дата: 12.03.23 13:49
Оценка:
Здравствуйте, wantus, Вы писали:

W>Здравствуйте, eustin, Вы писали:


E>>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.


W>За последнюю неделю 0.6% активных инсталлов — 32-битные. Остальные — 64-битные.

Спасибо) Очень зачанчиво убрать. А вот трекинга своего пока нет.
Re: 32 bit
От: maks1180  
Дата: 12.03.23 18:04
Оценка:
E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.

Я пока не пешёл на x64, так как смысла не вижу. Может лучше пересобрать новые либы на x32 чем терять клиентов ?
===============================================
(реклама, удалена модератором)
Re[2]: 32 bit
От: eustin  
Дата: 13.03.23 05:48
Оценка:
M>Я пока не пешёл на x64, так как смысла не вижу. Может лучше пересобрать новые либы на x32 чем терять клиентов ?
Это да.. Но еще размер exe пухнет, а он уже немалый (100 Мб + докачка после установки). Так что вдруг от этого больше народу отвалится)
Re: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 13.03.23 07:10
Оценка:
Здравствуйте, eustin, Вы писали:

E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.



Чтобы жрать больше памяти? Размер указателя то X2...
Я сейчас просмотрел список софта на своей машине. Реально в 64-х битах нуждаются только виртуальные машины, студия и некоторые игры. Притом игры, которые хотят 64 бита и больше 4 Гб памяти реально в них не нуждаются: большую часть АП они расходуют на маппинг текстур. Ты можешь сам в этом убедиться, если возьмёшь VMMap из SysinternalsSuite и посмотришь. Притом даже если выделено у них >2 Гб, то размер WS 2 Гб редко превосходит. Хороший пример неадекватного жора — Sims 4:
2,8 Гб Total
580 Mb Heap Size
И вот нафига козе баян!?

Ещё один пример — firefox, возьмём самый жирный процесс:
2.2 Гб Total
1,9 Гб Commited
711 Mb Private data
565 Mb WS
  картинка

Притом у FF максимальный закоммиченый блок — около 16 МБ. Т.е. фрагментация памяти для него вообще не проблема.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[2]: 32 bit
От: K13 http://akvis.com
Дата: 13.03.23 07:42
Оценка:
Ф>Я сейчас просмотрел список софта на своей машине. Реально в 64-х битах нуждаются только виртуальные машины, студия и некоторые игры.

Видеомонтаж. Тяжелые алгоритмы обработки фоток. Нейросети. Тут очень часто 32 бита уже не поддерживается.
Re[3]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 13.03.23 08:44
Оценка:
Здравствуйте, K13, Вы писали:

Ф>>Я сейчас просмотрел список софта на своей машине. Реально в 64-х битах нуждаются только виртуальные машины, студия и некоторые игры.


K13>Видеомонтаж. Тяжелые алгоритмы обработки фоток. Нейросети. Тут очень часто 32 бита уже не поддерживается.


Тяжёлые алгоритмы обработки фоток Сейчас открыл RAW в Canon Digital Photo Professional, подёргал туда-сюда подавление шумов и автокоррекцию яркости. Судя по скорости работы на моём i9, это тяжёлые алгоритмы. Сожрало в итоге 3.6 Total. Надо полагать, что если бы процесс был 32 бита, то сожрало бы меньше 3-х: 32 бита хватило бы.

Насчёт видео согласен.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.03.23 09:30
Оценка:
Здравствуйте, Aquilaware, Вы писали:

A>Когда-то мне понадобилось выделить 80 Мб непрерывной памяти — но на 32 битных системах это часто не срабатывало из-за фрагментации памяти.


Какой памяти?

A>иногда даже относительно скромные 80 Мб одним блоком выделить не получается, потому что в адресном пространстве иногда не бывает достаточно продолжительной свободной "дырки".


Чтобы создать такую ситуацию, нужно очень долго и целенаправленно забивать адресное пространство разным мусором. Для типичного приложения такая ситуация нереальна.
Re[2]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.03.23 09:41
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Чтобы жрать больше памяти? Размер указателя то X2...


"Вот прямо сразу" это ощутимо только на больших (миллионы элементов) списках. Сам по себе рост грамотно организованных кода/данных не настолько значителен.

Основная претензия к 32-разрядному коду в 64-разрядных системах в том, что все общение с системой идет через трансляцию. Приложение загружает 32-разрядные библиотеки-переходники, вызывает оттуда системные функции, те преобразуют параметры, вызывают 64-разрядные библиотеки, затем преобразуют результаты. Когда в запросе участвуют отдельные слова или небольшие структуры, накладные расходы невелики, но при обмене большими массивами данных приходится каждый раз выделять память из кучи, затем освобождать.

Но основной жор, как известно, создают просто неграмотно сделанные приложения. Предел в 2 Гб — единственное, что не дает им возможности жрать больше.
Re: 32 bit
От: velkin Удмуртия https://kisa.biz
Дата: 13.03.23 10:14
Оценка:
Здравствуйте, eustin, Вы писали:

E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.


Для примера статья Что установить: Windows 32-bit или 64-bit

Как видите, 64-битный режим работы имеет такие плюсы и минусы:
+ 64-битная система может работать со всем объемом оперативной памяти;
+ некоторые операции на 64-битном процессоре выполняются существенно быстрее;
— 64-битные указатели требуют больше памяти. Это увеличивает объем занимаемой приложениями оперативной памяти.

Там ещё идёт сравнение.

Результаты исследования вполне ожидаемы. Из-за использования режима совместимости 64-битная система при работе с обычными 32-битным программами показала чуть меньшую производительность.

Данное сравнение производительности также показало, что реальной пользы от 4 гигабайт оперативной памяти в том наборе приложений нет. Тут важно заметить, что на самом деле в тяжелых приложениях вроде графических редакторов, систем автоматизированного проектирования (CAD) и прочих объем оперативной памяти играет ключевую роль. Там от дополнительных гигабайт оперативной памяти реальная польза действительно есть.


Лично я же думаю так.
1. Смысл в 32-ух битных приложениях для повышенной совместимости включая 32-ух и 64-ёх битную архитектуру процессора и операционной системы.
2. Смысл в 64-ёх битных приложениях для использования 64-ёх битных инструкций и 64-ёх битной адресации при том, что архитектура процессора и операционная система тоже 64-ёх битные.

1. Каждый вариант имеет преимущества и недостатки.
2. Использование сразу двух вариантов имеет только преимущества без недостатков.

Большинство пользователей скорее всего сидят на 64-ёх битных процессорах и операционных системах. Потери 32-ух битных пользователей скорее всего будут небольшими, но они будут. В принципе, конечно, пора уже отказываться от 32-ух битов. Но с другой стороны 32-ух битные приложения более совместимы.

А ещё моду на отбрасывание 32-ух бит задала Apple, но тут нужно понимать, что они вообще всё отбрасывают. Отбрасывают свои же старые интеловские макбуки и переходят на свои процессоры. Отбрасывают стандартные графические библиотеки и пилят своё.

Плюют на крупнейшего производителя игрового движка вроде Unreal Engine от Epic Games. Вообще всех гнобят и старые айфоны уж извините это старые айфоны, покупайте новые или гуляйте без учётной записи.

В общем я тоже разрешаю отказаться от 32-ух битной архитектуры в пользу одной лишь 64-битной. Но если есть время, то можно было бы сделать две версии для каждого семейства операционок.

Так сказать показать, что ты как 7zip или total commander.
https://www.7-zip.org/
https://www.ghisler.com/download.htm
Ну или ещё кто, а не простой Вася из подворотни.

Cмысла в 32-ух битах лично я не вижу и сам не использую, за исключением того, если только у разработчика есть только такая версия. Хотя для Wine 32-ух битное приложение было бы лучше, но это из-за изначальных настроек и скорости развития самого Wine. Да и здесь больше уже вопрос создания нативных версий для других семейств операционных систем отличных от Windows.
Re[2]: 32 bit
От: icezone  
Дата: 13.03.23 10:44
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Чтобы жрать больше памяти? Размер указателя то X2...


у видеокодека SVT-AV1 минимальные требования x64, под x86 собрать можно, но вылетает из-за нехватки памяти

еще смешнее — попробовал собрать AOM AV1 — студия сожарала 50+ GB и вылетела с ошибкой — нехватка памяти
Re[3]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 13.03.23 11:24
Оценка:
Здравствуйте, icezone, Вы писали:

I>у видеокодека SVT-AV1 минимальные требования x64, под x86 собрать можно, но вылетает из-за нехватки памяти


а что, реально больше 3-х гигов отжирает?
Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.03.23 11:28
Оценка:
Здравствуйте, icezone, Вы писали:

I>попробовал собрать AOM AV1 — студия сожарала 50+ GB и вылетела с ошибкой — нехватка памяти


Сама студия, или запущенные ею утилиты (компилятор/линкер и т.п.)?
Re[3]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 13.03.23 11:52
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, Философ, Вы писали:


Ф>>Чтобы жрать больше памяти? Размер указателя то X2...

ЕМ>"Вот прямо сразу" это ощутимо только на больших (миллионы элементов) списках. Сам по себе рост грамотно организованных кода/данных не настолько значителен.
ЕМ>..
ЕМ>Но основной жор, как известно, создают просто неграмотно сделанные приложения. Предел в 2 Гб — единственное, что не дает им возможности жрать больше.

Зачем миллионы? Достаточно одного объекта в куче, у которого пара булевых полей, пара интовых, а ещё несколького геттеров, несколько сеттеров и один vtable. Сам посчитай оверхед. Собственно, чем больше объектов тем меньше оверхед. Но даже если их очень много, в этом примере оверхед значительный. Я могу на примере формочки с кнопочкой такое продемонстрировать, с цифирками.

ЕМ>Основная претензия к 32-разрядному коду в 64-разрядных системах в том, что все общение с системой идет через трансляцию.


гм... любопытно. А где об этом можно почитать? Почему при нативных вызовах такого не происходит?
Всё сказанное выше — личное мнение, если не указано обратное.
Re[3]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.03.23 12:29
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>А значит меньше программы влезет в кэш процессора


Думаете, среди нас есть такие, кому лично довелось испытать сколько-нибудь заметное падение быстродействия собственного софта по этой причине, и при этом в софте не было явных косяков?
Re[5]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 13.03.23 13:10
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Почему меньше? Он постоянный на каждый объект.


А если 0 объектов, а vtable в памяти!?

Ф>>Но даже если их очень много, в этом примере оверхед значительный.


ЕМ>Вот он и становится заметным, только когда таких объектов очень много. Впрочем, на фоне современных браузеров почти любой оверхед уже выглядит незначительным. У них тоже начиналось с "ну ладно, пусть страница занимает на 100 килобайт больше, зато навигация будет быстрее". А теперь — "вроде бы эти 20 мегабайт тут лишние, да и хрен с ними, щас прикрутим еще какую-нибудь свистоперделку".



ЕМ>>>все общение с системой идет через трансляцию.

Ф>>где об этом можно почитать?
ЕМ>Если про винду, то гуглите по WOW64. Собственно, то же самое происходит и при запуске 16-разрядного кода в 32-разрядной винде.

Ты говорил про большие объёмы данных и выделение памяти в куче для трансляции. Я не могу этого в документации найти, как минимум тут и вот тут нету. Про трансляцию через выделение в куче я ничего не могу найти. Про то, что стековые аргументы расширяются до 64 бит и так ясно. Про то, что ядерные вызовы дорогими получаются тоже понятно, но они без этого как бы не дешёвые.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[4]: 32 bit
От: TailWind  
Дата: 13.03.23 13:27
Оценка:
ЕМ>Думаете, среди нас есть такие, кому лично довелось испытать сколько-нибудь заметное падение быстродействия собственного софта по этой причине, и при этом в софте не было явных косяков?

Думаю, что вы опять задаёте странные вопросы, когда не согласны с тезисом
Re[3]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 13.03.23 14:06
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Но эмуляция арифметических 64-бит операций в 32-битной программе будет, конечно, медленней чем нативные 64-бит


Там нет эмуляции. AMD64 нативно исполняет 32-битный код.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[4]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 13.03.23 14:11
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Думаете, среди нас есть такие, кому лично довелось испытать сколько-нибудь заметное падение быстродействия собственного софта по этой причине, и при этом в софте не было явных косяков?


Лично мне просто не приходило в голову собирать под 64 бита то, для чего 32 вполне хватало (это для моих поделок). А на работе всё по большей части упиралось либо в сеть, либо в диск, либо в системные вызовы, либо в SQLite. Ну а потому, когда на работе работаешь обычно не до бенчмарков — данные подбираются так, чтобы их для задачи хватило.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[5]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.03.23 15:08
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>вы опять задаёте странные вопросы


И чем же они страннее других вопросов, заданных в этой теме?
Re[4]: 32 bit
От: TailWind  
Дата: 13.03.23 15:16
Оценка:
Ф>Там нет эмуляции. AMD64 нативно исполняет 32-битный код.

INT64 + INT64
Или INT64 ++

32-bit compiler разложит на несколько инструкций
А 64-bit compiler сделает за одну
Re[5]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.03.23 15:16
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>мне просто не приходило в голову собирать под 64 бита то, для чего 32 вполне хватало


Я бы тоже не собирал, но некоторые системные операции (например, установка/удаление драйверов в винде) могут выполняться только из приложений родной разрядности. Ну и многие юзеры искренне полагают, что 32-разрядное приложение в 64-разрядной системе — это что-то кривое, наподобие 16-разрядного в 32-разрядной, и просят "родное". Так что все релизы давно собираются под x86/x86, а сейчас еще и под arm64.
Re[6]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.03.23 15:20
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>А если 0 объектов, а vtable в памяти!?


Мы сейчас реальные, ощутимые затраты оцениваем, или занимаемся мелочным крохоборством?

Ф>Ты говорил про большие объёмы данных и выделение памяти в куче для трансляции.


Я сейчас с ходу не вспомню, где это используется — есть у винды какие-то функции, где могут передаваться/приниматься длинные таблицы, размеры данных в которых зависят от разрядности. А большинство преобразований, конечно же, идет через стек.
Re[6]: 32 bit
От: TailWind  
Дата: 13.03.23 15:45
Оценка:
ЕМ>И чем же они страннее других вопросов, заданных в этой теме?

Минутка психотерапии:

Утверждайте, а не спрашивайте
Вам страшно сказать своё мнение?
Страшно перечить?
Зачем вы прячитесь за вопросами?

Более того вы ещё и прячитесь за "всеми участинками форума"

Сложно сказать: я делал тест производительности с компилятором 32 и 64 бит и на моих задачах не было существенной разницы
?

Нет вот надо как-то из под боку заходить
Re[7]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 13.03.23 15:56
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Минутка психотерапии:


Вы твердо уверены, что из нас двоих психотерапия нужна именно мне?

TW>Сложно сказать: я делал тест производительности с компилятором 32 и 64 бит и на моих задачах не было существенной разницы?


Конечно, делал, и не раз.

Но дискуссия, напомню, не о том, имеют ли смысл 32-разрядные приложения вообще, а о том, стоит ли индивидуальному разработчику (это во многом определяет уровень сложности и применимости задач) полностью переходить на 64-разрядную архитектуру. Раз Вы в рамках этой дискуссии утверждаете "меньше программы влезет в кэш процессора", значит, считаете этот фактор важным и существенным именно в этом аспекте. Вот мне и стало интересно, кому из нас действительно имеет смысл помнить о размере кэша процессора и соотносить его с размером кода/данных, ибо все более важные причины нехватки быстродействия уже устранены.
Re[8]: 32 bit
От: TailWind  
Дата: 13.03.23 16:37
Оценка:
ЕМ>Вы твердо уверены, что из нас двоих психотерапия нужна именно мне?
Я совершенно по дружески рассказываю вам то что вижу в вашем поведении некую странность
Тут многие пытаются соревносться у кого больше эго, это вообще не про то что я вам говорю
Так что не обижайтесь. Люди вокруг кривые зеркала. Но иногда в них можно увидеть что-то важное для себя

TW>>Сложно сказать: я делал тест производительности с компилятором 32 и 64 бит и на моих задачах не было существенной разницы?

ЕМ>Конечно, делал, и не раз.

ЕМ>Раз Вы в рамках этой дискуссии утверждаете "меньше программы влезет в кэш процессора", значит, считаете этот фактор важным и существенным именно в этом аспекте.


Да считаю
Но просто считать мало
Надо делать тесты
Re[4]: 32 bit
От: icezone  
Дата: 13.03.23 22:34
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>а что, реально больше 3-х гигов отжирает?


сейчас и не помню, но вылетала явно раньше
и это я 4к даже не пробовал
Re[4]: 32 bit
От: icezone  
Дата: 13.03.23 22:41
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Здравствуйте, icezone, Вы писали:


I>>попробовал собрать AOM AV1 — студия сожрала 50+ GB и вылетела с ошибкой — нехватка памяти


ЕМ>Сама студия, или запущенные ею утилиты (компилятор/линкер и т.п.)?


проверял на 2017 и 2022 Студиях

compiler is out of heap space

сперва пробовал 32-битный компилятор, тот вылетел сразу
потом на ноутбуке с 16Гб оперативки запускал 64-битный компилятор — дошел до 40Гб и выдал ошибку
пересел на десктоп с 32Гб — сожрал примерно 55Гб и тоже упал...

помог только запрет inline функций
Re[5]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 14.03.23 03:20
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>INT64 + INT64

TW>Или INT64 ++

TW>32-bit compiler разложит на несколько инструкций

TW>А 64-bit compiler сделает за одну


Во-первых, AMD64 всё ещё нативно исполняет 32-битный код. Возражение не принято.
Во-вторых, как много у тебя математики на int64? Зачем она нужна? Ну кроме вычисления адреса.

В-третьих, похоже у меня есть повод тебя сильно удивить.
  код на шарпе
       static void Main(string[] args)
        {
            Console.WriteLine("test speed for 32");
            for (int a = 0; a < 10; a++)
            {
                TestSpeedInt32();
            }

            Console.WriteLine("test speed for 64");

            for (int a = 0; a < 10; a++)
            {
                TestSpeedInt64();
            }
        }

        const int iterations = 10 * 1000 * 1000;

        private static unsafe void TestSpeedInt32()
        {
            System.Int32 a, b, c, d, e, f, g, h;
            a = b = c = d = e = f = g = h = 0;
            var sw = Stopwatch.StartNew();
            for (int i = 0; i < iterations; i++)
            {
                a++;
                b++;
                c++;
                d++;
                e++;
                f++;
                g++;
                h++;
            }
            sw.Stop();
            var variablesIncrementTime = sw.ElapsedTicks;

            sw.Restart();
            var smallArray = stackalloc System.Int32[8];
            for (int i = 0; i < iterations; i++)
            {
                ++smallArray[0];
                ++smallArray[1];
                ++smallArray[2];
                ++smallArray[3];
                ++smallArray[4];
                ++smallArray[5];
                ++smallArray[6];
                ++smallArray[7];
            }
            sw.Stop();
            var arrayItemIncrementTime = sw.ElapsedTicks;
            Console.WriteLine("elapsed for variable =  {0:D} \tarray = {1:D}", variablesIncrementTime , arrayItemIncrementTime);
        }
        private static unsafe void TestSpeedInt64()
        {
            System.Int64 a, b, c, d, e, f, g, h;
            a = b = c = d = e = f = g = h = 0;
            var sw = Stopwatch.StartNew();
            for (int i = 0; i < iterations; i++)
            {
                a++;
                b++;
                c++;
                d++;
                e++;
                f++;
                g++;
                h++;
            }
            sw.Stop();
            var variablesIncrementTime = sw.ElapsedTicks;

            sw.Restart();
            var smallArray = stackalloc System.Int64[8];
            for (int i = 0; i < iterations; i++)
            {
                ++smallArray[0];
                ++smallArray[1];
                ++smallArray[2];
                ++smallArray[3];
                ++smallArray[4];
                ++smallArray[5];
                ++smallArray[6];
                ++smallArray[7];
            }
            sw.Stop();
            var arrayItemIncrementTime = sw.ElapsedTicks;
            Console.WriteLine("elapsed for variable =  {0:D} \tarray = {1:D}", variablesIncrementTime , arrayItemIncrementTime);
        }


  результаты теста на .net 4.8
RELEASE x86
test speed for 32
elapsed for variable =  29938   array = 208879
elapsed for variable =  29850   array = 209862
elapsed for variable =  30037   array = 210031
elapsed for variable =  29861   array = 208852
elapsed for variable =  29823   array = 209040
elapsed for variable =  29852   array = 208794
elapsed for variable =  29806   array = 208832
elapsed for variable =  29969   array = 209887
elapsed for variable =  29888   array = 209699
elapsed for variable =  30235   array = 211679
test speed for 64
elapsed for variable =  46366   array = 358094
elapsed for variable =  33484   array = 357904
elapsed for variable =  35593   array = 357942
elapsed for variable =  36421   array = 358376
elapsed for variable =  34880   array = 358300
elapsed for variable =  36807   array = 357978
elapsed for variable =  36902   array = 357956
elapsed for variable =  33078   array = 357680
elapsed for variable =  34724   array = 358055
elapsed for variable =  33380   array = 357987

RELEASE x64
test speed for 32
elapsed for variable =  74742   array = 238943
elapsed for variable =  74613   array = 238674
elapsed for variable =  74580   array = 239054
elapsed for variable =  74504   array = 238877
elapsed for variable =  74759   array = 238828
elapsed for variable =  74518   array = 238862
elapsed for variable =  74883   array = 239424
elapsed for variable =  74698   array = 244281
elapsed for variable =  74820   array = 238945
elapsed for variable =  74495   array = 238827
test speed for 64
elapsed for variable =  90245   array = 238788
elapsed for variable =  93368   array = 238568
elapsed for variable =  96092   array = 239351
elapsed for variable =  89619   array = 238821
elapsed for variable =  100410  array = 239856
elapsed for variable =  93027   array = 238582
elapsed for variable =  90229   array = 238834
elapsed for variable =  89806   array = 238840
elapsed for variable =  97128   array = 238660
elapsed for variable =  94326   array = 238535


Занимательные результаты, правда!? Конечно же инкремент int64 в x86 медленнее чем int32 — это логично. Но, во-первых код под x64 прям заметно медленнее, а во-вторых даже на x64 инкремент int64 в x86 медленнее чем int32. Притом существенно медленнее!!!
Процессор-то не так прост оказывается..

На дизассемблер пока нет времени — чуть-чуть позже выложу (причёсывать и расписывать его долго). Там ничего не обычного.
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 14.03.2023 3:23 Философ . Предыдущая версия .
Re[6]: 32 bit
От: TailWind  
Дата: 14.03.23 07:46
Оценка:
Ф>Занимательные результаты, правда!?
Да
Сделайте кто-нибудь на C++ с оптимизацией, плиз
Я бы сам сделал, но долго разбираться как настроить компилятор на 64-бит

Ф>Во-вторых, как много у тебя математики на int64? Зачем она нужна? Ну кроме вычисления адреса.

У меня лично на каждом шагу. Для вычисления смещений больше 4ГБ
map<INT64, record> часто встречается. А там ещё и операции сравнения вылезают

Кстати хороший тест
Можно сравнить производительность map для ключей ULONG и UINT64, добавляя в него рандомнные значения
Отредактировано 14.03.2023 7:49 TailWind . Предыдущая версия .
Re[7]: 32 bit
От: TailWind  
Дата: 14.03.23 09:03
Оценка:
TW>Кстати хороший тест
TW>Можно сравнить производительность map для ключей ULONG и UINT64, добавляя в него рандомнные значения

template <class T>
void Test()
{
  map<T, ULONG> Map;
  //
  My_Timer Timer;
  //
  for (ULONG i=0; i<50000000; i++)
  Map[rand()] = 1;
  //
  printf(L"Time %d ms\n", Timer.ms());
}



Для 32-bit платформы и компилятора:
Для ULONG 6703 ms
Для UINT64 7641 ms

Интересно, что на 64-бит будет
Отредактировано 14.03.2023 9:07 TailWind . Предыдущая версия . Еще …
Отредактировано 14.03.2023 9:04 TailWind . Предыдущая версия .
Re[8]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 14.03.23 09:31
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Интересно, что на 64-бит будет


Не знаю — потом посмотрю. Я не плюсовик и настройка проекта для меня не секундное дело — тратить рабочее время на это не буду.
Тест ИМХО не очень: рэндомайзер убивает повторяемость. Если уж рэндомайзер, то надо надо много проходов, вместе с поиском медианы, минимума и стандартной ошибки.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[9]: 32 bit
От: TailWind  
Дата: 14.03.23 09:36
Оценка:
Ф>Тест ИМХО не очень: рэндомайзер убивает повторяемость. Если уж рэндомайзер, то надо надо много проходов, вместе с поиском медианы, минимума и стандартной ошибки.
Не убивает
Он обязан выдавать одни и те же значаения при повторном запуске программы
Re[10]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 14.03.23 09:54
Оценка:
Здравствуйте, TailWind, Вы писали:

Ф>>Тест ИМХО не очень: рэндомайзер убивает повторяемость. Если уж рэндомайзер, то надо надо много проходов, вместе с поиском медианы, минимума и стандартной ошибки.

TW>Не убивает
TW>Он обязан выдавать одни и те же значаения при повторном запуске программы

Может быть, может быть... А сколько времени работал сам рэндомайзер в этом примере?
Всё сказанное выше — личное мнение, если не указано обратное.
Re[11]: 32 bit
От: TailWind  
Дата: 14.03.23 11:55
Оценка:
Ф>А сколько времени работал сам рэндомайзер в этом примере?
Не многим дольше чем i++
Re[5]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.03.23 12:33
Оценка:
Здравствуйте, Aquilaware, Вы писали:

A>Знаменитые "640 килобайт хватит всем".


У меня, если что, еще ни один бинарник даже за 300 не перевалил, так что в 16-разрядном коде, при той же функциональности, оно бы и на 640 кб работало.

Всем, конечно, не хватит, но подавляющее большинство современного софта превышает реальные потребности в десятки-сотни раз.
Re[7]: 32 bit
От: TailWind  
Дата: 14.03.23 18:57
Оценка:
R>Код: (увеличил количество итераций в 10 раз, время в миллисекундах)

Надо бы ещё в 10 раз увеличить
А то больно 16 мс погрешность gettckcount вылезает
Re[9]: 32 bit
От: TailWind  
Дата: 14.03.23 19:34
Оценка:
Класс!
Ну и кто это может объяснить?

Почему 32-бит на 64 медленней?

Хотя у array одинаково
Может паскалевские замарочки?
Отредактировано 14.03.2023 20:04 TailWind . Предыдущая версия .
Re[11]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.03.23 20:39
Оценка:
Здравствуйте, Marty, Вы писали:

M>У меня для такого cxx03.bat/cxx11.bat/cxx14.bat/cxx17.bat в путях лежат


У меня таких два десятка лежит. А у того, кому отвечал, таких явно нет.
Re[7]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 14.03.23 21:18
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Этот ваш дотнет — ненастоящий. Вот другие результаты:

R>Image: KwE4NVU.png

R>Код: (увеличил количество итераций в 10 раз, время в миллисекундах)

R>
program Project1;

R>  VariablesIncrementTime := GetTickCount;


Понятно Наши паскалисты не настоящие.
Не настоящие!
  боже, какой позор
   [__DynamicallyInvokable]
    public long ElapsedTicks
    {
      [__DynamicallyInvokable] get => this.GetRawElapsedTicks();
    }
    [__DynamicallyInvokable]
    public static long GetTimestamp()
    {
      if (!Stopwatch.IsHighResolution)
        return DateTime.UtcNow.Ticks;
      long num = 0;
      SafeNativeMethods.QueryPerformanceCounter(out num);
      return num;
    }

    private long GetRawElapsedTicks()
    {
      long elapsed = this.elapsed;
      if (this.isRunning)
      {
        long num = Stopwatch.GetTimestamp() - this.startTimeStamp;
        elapsed += num;
      }
      return elapsed;
    }

    [DllImport("kernel32.dll")]
    public static extern bool QueryPerformanceCounter(out long value);

Всё сказанное выше — личное мнение, если не указано обратное.
Re[10]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 14.03.23 21:20
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Класс!

TW>Ну и кто это может объяснить?

Я могу: плюсовики, похоже, тоже
Автор: Философ
Дата: 15.03.23
не настоящие.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[10]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.03.23 21:26
Оценка:
Здравствуйте, TailWind, Вы писали:

TW>Почему 32-бит на 64 медленней?


Он не медленнее, одинаково оно. Вся простая арифметика в пределах слова выполняется за один такт.

TW>Может паскалевские замарочки?


Скорее всего. В сях при таких тестах тоже надо следить, чтоб шибко умный компилятор не наоптимизировал. Даже древний VC++ конца 90-х много чего умеет.
Re[8]: 32 bit
От: rudzuk  
Дата: 14.03.23 21:27
Оценка:
Здравствуйте, Философ, Вы писали:

Ф> Понятно Наши паскалисты не настоящие.

Ф> Не настоящие!

Не пойму, что ты сказать хотел
avalon/3.0.2
Re[6]: 32 bit
От: Aquilaware  
Дата: 14.03.23 21:29
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>У меня, если что, еще ни один бинарник даже за 300 не перевалил


Это, кстати, интересная тема. Надо бы замутить опрос по размеру выходных артефактов разрабатываемого ПО. У нас это мегабайты — десятки мегабайт. Меньше не получается, иначе полный функционал продукта невозможно реализовать.
Re[8]: 32 bit
От: Aquilaware  
Дата: 14.03.23 21:33
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Вы твердо уверены, что из нас двоих психотерапия нужна именно мне?


Я тоже вижу в вашем поведении такие же странности как и коллега. У вас такая уверенность в вашей исключительности, что вам просто необходимо преобразовать этот напор нарцисизма и эгоизма в деньги, вместо того чтобы воевать с ветрянными мельницами на страницах форума.
Re[9]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 14.03.23 21:42
Оценка:
Здравствуйте, Aquilaware, Вы писали:

A>У вас такая уверенность в вашей исключительности


Определенная исключительность наличествует во многих. Но таки интересно, из чего именно Вы делаете такой вывод?

A>вам просто необходимо преобразовать этот напор нарцисизма и эгоизма в деньги


В смысле — стать блогером-миллионником?
Re[9]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 14.03.23 21:54
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Здравствуйте, Философ, Вы писали:


Ф>> Понятно Наши паскалисты не настоящие.

Ф>> Не настоящие!

R>Не пойму, что ты сказать хотел


Такой код меряют не в милисекундах. Даже во времена Pentium 4 для этого использовался HPET иначе ничего хорошего не намеряешь. Некоторые по привычке использовали RTDSC. А ещё раньше использовали только RDTSC. В крайнем случае люди использовали Multimedia timers.


Позор это потому, что ты что-то намерял, удивился полученным результатам и понёс на форум. Даже не подумал о том, что у тебя результаты прям сильно-сильно другие. Это ошибка десятиклассника, который в физической задаче ошибся на пять порядков, не придал этому значения и записал в ответ.

У вас в паскале есть вот такая обёртка https://wiki.freepascal.org/EpikTimer/ru
Почти во всех языках в стандартных библиотеках такое обычно есть из коробки — профилирование кода слишком распространённая задача.

Там внутри вот это используется.
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 14.03.2023 21:59 Философ . Предыдущая версия .
Re[10]: 32 bit
От: rudzuk  
Дата: 14.03.23 22:20
Оценка:
Здравствуйте, Философ, Вы писали:

Ф> Такой код меряют не в милисекундах. Даже во времена Pentium 4 для этого использовался HPET иначе ничего хорошего не намеряешь. Некоторые по привычке использовали RTDSC. А ещё раньше использовали только RDTSC. В крайнем случае люди использовали Multimedia timers.


Ф> Позор это потому, что ты что-то намерял, удивился полученным результатам и понёс на форум. Даже не подумал о том, что у тебя результаты прям сильно-сильно другие. Это ошибка десятиклассника, который в физической задаче ошибся на пять порядков, не придал этому значения и записал в ответ.


Именно из-за миллисекунд я и увеличил количество итераций. Это первое. Второе. Это не задача профилирования кода, где нужно количество тактов ловить.

Ф> У вас в паскале есть вот такая обёртка https://wiki.freepascal.org/EpikTimer/ru

Ф> Почти во всех языках в стандартных библиотеках такое обычно есть из коробки — профилирование кода слишком распространённая задача.

Ф> Там внутри вот это используется.


Что есть у нас в паскале я знаю. Код написан именно так, чтобы любой мог его собрать без установки подополнительных пакетов.
avalon/3.0.2
Re[11]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 14.03.23 22:25
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Именно из-за миллисекунд я и увеличил количество итераций. Это первое. Второе. Это не задача профилирования кода, где нужно количество тактов ловить.


Ага, я видел. Только при этом ты на полном серьёзе утверждаешь, что этот наш .net не настоящий. Да-да, медленный слишком.

R>Что есть у нас в паскале я знаю. Код написан именно так, чтобы любой мог его собрать без установки подополнительных пакетов.


В таких случаях самостоятельно дергают QPC. Некоторые извращенцы при этом даже из .net дёргают RDTSC, например вот здесь Сидиристый поступил именно так.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[13]: 32 bit
От: rudzuk  
Дата: 14.03.23 23:36
Оценка:
Здравствуйте, rudzuk, Вы писали:

r> А ты сам не видишь дичь в результатах своих замеров? 64-битный код с треском сливает 32-битному, работая в родном для себя режиме. И это объясняется тем, что процессор, оказывается, не так прост. фасепальм.


Решил запустить твой код у себя:

FW 4.0.30319 (ключи /unsafe /platform:x86|x64 /o /checked-)



Так что да, ты прав — твой процессор не так прост
avalon/3.0.2
Re[14]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 15.03.23 02:11
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>Image: Aqj7Hho.png

R>Так что да, ты прав — твой процессор не так прост

Что у тебя за проц? Я всё понять не могу, почему у тебя инкремент Int32 почти в 1.4 раза медленне чем у меня. Тем более, что мой i9 работает на частоте 3.9 — я ему обрезал частоты, чтобы меньше комнату обогревал. И почему такой разброс значений!?
Ты под дебаггером код запускаешь что-ли?
Всё сказанное выше — личное мнение, если не указано обратное.
Re[13]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 15.03.23 02:12
Оценка:
Здравствуйте, rudzuk, Вы писали:

R>А ты сам не видишь дичь в результатах своих замеров? 64-битный код с треском сливает 32-битному, работая в родном для себя режиме. И это объясняется тем, что процессор, оказывается, не так прост. фасепальм.


Во-первых я заглядывал в дизасм, в то, что получилось после джиттера — там не было ничего экстраординарного. Во-вторых, я знаю что команды в современном x86 — это не инструкции. Сегодня x86 имеет RISC ядро, и сами команды декодирует в микрооперации, которые потом исполняте гипер-конвеер. Гипер-конвеерная архитектура появилаесь ещё в Pentium-4, а переупорядочивание команд в конвеере появилось ещё раньше аж в Pentium Pro, читать вот здесь.
Если ты посмотришь на модную штучку времён Core 2Duo ( Wide Dyanamic Execution) то увидишь там более 1 ALU.
В сочетании с переупорядочиванием инструкций (Out of order execution), то должен бы перестать удивлять тому, что частенько 2 команды выполняются дольше чем 5. Я этому удивляться перестал много лет назад, когда экспериментировал с командами процессора: у меня частенько rdtsc мерял 0 тактов на команду. Потом я открыл для себя fence-операции, в частности full-fence (примерно тогда уже узнал зачем нужен барьер памяти).

Понимаешь, нельзя сказать, сколько тактов займёт условный inc qword ptr [r15] и не получится его просто так сравнить с кодом аналогичного назначения для 32-бит. Поэтому и написать вручную оптимизированный ассемблерный код — совсем непростая задача.

R>Ну, сильно изменился общий результат?


Для начала расскажи как запускал. Есть серьёзное подозрение, что под дебаггером. На эту мысль наводят довольно большие цифры по сравнению с некоторыми моими. Например increment Int64 под x64 у меня более чем вдвое быстрее. Во-вторых, покажи что там компилятор паскали наоптимизировал.
  что произвёл джиттер
  как в WinDBG добраться до ассемблера (на примере x64)
0:000> !DumpDomain
--------------------------------------
System Domain:      00007ffd7b1da740
LowFrequencyHeap:   00007ffd7b1dacb8
HighFrequencyHeap:  00007ffd7b1dad48
StubHeap:           00007ffd7b1dadd8
Stage:              OPEN
Name:               None
--------------------------------------
Shared Domain:      00007ffd7b1da170
LowFrequencyHeap:   00007ffd7b1dacb8
HighFrequencyHeap:  00007ffd7b1dad48
StubHeap:           00007ffd7b1dadd8
Stage:              OPEN
Name:               None
Assembly:           0000022c68d14de0 [C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader:        0000022c68d07b50
  Module Name
00007ffd74071000            C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

--------------------------------------
Domain 1:           0000022c68cc9370
LowFrequencyHeap:   0000022c68cc9b68
HighFrequencyHeap:  0000022c68cc9bf8
StubHeap:           0000022c68cc9c88
Stage:              OPEN
SecurityDescriptor: 0000022c68ca8460
Name:               ConsoleApp12.exe
Assembly:           0000022c68d14de0 [C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll]
ClassLoader:        0000022c68d07b50
SecurityDescriptor: 0000022c68d04e40
  Module Name
00007ffd74071000            C:\Windows\Microsoft.Net\assembly\GAC_64\mscorlib\v4.0_4.0.0.0__b77a5c561934e089\mscorlib.dll

Assembly:           0000022c68d22bb0 [C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\bin\x64\Release\ConsoleApp12.exe]
ClassLoader:        0000022c68d22cd0
SecurityDescriptor: 0000022c68d04d50
  Module Name
00007ffd1b184148            C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\bin\x64\Release\ConsoleApp12.exe

Assembly:           0000022c68d2ad00 [C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll]
ClassLoader:        0000022c68d2b3b0
SecurityDescriptor: 0000022c68d057a0
  Module Name
00007ffd6fe01000            C:\Windows\Microsoft.Net\assembly\GAC_MSIL\System\v4.0_4.0.0.0__b77a5c561934e089\System.dll


0:000> !DumpModule  -MT /d 00007ffd1b184148
Name:       C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\bin\x64\Release\ConsoleApp12.exe
Attributes: PEFile 
Assembly:   0000022c68d22bb0
LoaderHeap:              0000000000000000
TypeDefToMethodTableMap: 00007ffd1b180070
TypeRefToMethodTableMap: 00007ffd1b180090
MethodDefToDescMap:      00007ffd1b1801e0
FieldDefToDescMap:       00007ffd1b180258
MemberRefToDescMap:      0000000000000000
FileReferencesMap:       00007ffd1b1802c8
AssemblyReferencesMap:   00007ffd1b1802d0
MetaData start address:  0000022c68c123c4 (3404 bytes)

Types defined in this module

              MT          TypeDef Name
------------------------------------------------------------------------------
00007ffd1b185b28 0x02000002 ConsoleApp12.Program

Types referenced in this module

              MT            TypeRef Name
------------------------------------------------------------------------------
00007ffd74095dd8 0x02000013 System.Object
00007ffd74110ec0 0x02000017 System.TimeSpan
00007ffd74116690 0x02000018 System.Threading.CancellationTokenSource
00007ffd74117030 0x02000019 System.Nullable`1
00007ffd74118ad8 0x0200001a System.Security.Principal.WindowsIdentity
00007ffd74114d38 0x0200001b System.IO.FileStream
00007ffd6fe7be98 0x0200001c System.Diagnostics.Stopwatch
00007ffd740849e0 0x02000024 System.Console
00007ffd7409aea8 0x02000025 System.Int64
0:000> !DumpMT /d 00007ffd1b185b28
EEClass:         00007ffd1b1826d0
Module:          00007ffd1b184148
Name:            ConsoleApp12.Program
mdToken:         0000000002000002
File:            C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\bin\x64\Release\ConsoleApp12.exe
BaseSize:        0x18
ComponentSize:   0x0
Slots in VTable: 12
Number of IFaces in IFaceMap: 0
0:000> !DumpMT -MD 00007ffd1b185b28
EEClass:         00007ffd1b1826d0
Module:          00007ffd1b184148
Name:            ConsoleApp12.Program
mdToken:         0000000002000002
File:            C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\bin\x64\Release\ConsoleApp12.exe
BaseSize:        0x18
ComponentSize:   0x0
Slots in VTable: 12
Number of IFaces in IFaceMap: 0
--------------------------------------
MethodDesc Table
           Entry       MethodDesc    JIT Name
00007ffd745f3450 00007ffd74078de8 PreJIT System.Object.ToString()
00007ffd7460dc60 00007ffd7423c180 PreJIT System.Object.Equals(System.Object)
00007ffd745f3090 00007ffd7423c1a8 PreJIT System.Object.GetHashCode()
00007ffd745f0420 00007ffd7423c1b0 PreJIT System.Object.Finalize()
00007ffd1b290500 00007ffd1b185b10   NONE ConsoleApp12.Program..cctor()
00007ffd1b2904f0 00007ffd1b185b08   NONE ConsoleApp12.Program..ctor()
00007ffd1b290490 00007ffd1b185a70   NONE ConsoleApp12.Program.WaitForSingleObject(IntPtr, UInt32)
00007ffd1b2904a0 00007ffd1b185ab8   NONE ConsoleApp12.Program.B(System.Object)
00007ffd1b2904b0 00007ffd1b185ac8   NONE ConsoleApp12.Program.A(System.Object)
00007ffd1b290890 00007ffd1b185ad8    JIT ConsoleApp12.Program.Main(System.String[])
00007ffd1b2908f0 00007ffd1b185ae8    JIT ConsoleApp12.Program.TestSpeedInt32()
00007ffd1b290ae0 00007ffd1b185af8    JIT ConsoleApp12.Program.TestSpeedInt64()
0:000> !DumpMD /d 00007ffd1b185af8
Method Name:  ConsoleApp12.Program.TestSpeedInt64()
Class:        00007ffd1b1826d0
MethodTable:  00007ffd1b185b28
mdToken:      0000000006000006
Module:       00007ffd1b184148
IsJitted:     yes
CodeAddr:     00007ffd1b290ae0
Transparency: Critical
  x64
  ConsoleApp12.Program.TestSpeedInt64
0:000> !U /d 00007ffd1b290ae0
Normal JIT generated code
ConsoleApp12.Program.TestSpeedInt64()
Begin 00007ffd1b290ae0, size 1d2
*** WARNING: Unable to verify checksum for C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\bin\x64\Release\ConsoleApp12.exe
C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 206:
>>> 00007ffd`1b290ae0 55              push    rbp
00007ffd`1b290ae1 4157            push    r15
00007ffd`1b290ae3 4156            push    r14
00007ffd`1b290ae5 4155            push    r13
00007ffd`1b290ae7 4154            push    r12
00007ffd`1b290ae9 57              push    rdi
00007ffd`1b290aea 56              push    rsi
00007ffd`1b290aeb 53              push    rbx
00007ffd`1b290aec 4883ec48        sub     rsp,48h
00007ffd`1b290af0 488d6c2420      lea     rbp,[rsp+20h]
00007ffd`1b290af5 33c0            xor     eax,eax
00007ffd`1b290af7 48894500        mov     qword ptr [rbp],rax
00007ffd`1b290afb 48894520        mov     qword ptr [rbp+20h],rax
00007ffd`1b290aff 48896520        mov     qword ptr [rbp+20h],rsp
00007ffd`1b290b03 48b8f245d3bc9c3b0000 mov rax,3B9CBCD345F2h
00007ffd`1b290b0d 48894500        mov     qword ptr [rbp],rax
00007ffd`1b290b11 33f6            xor     esi,esi
00007ffd`1b290b13 33ff            xor     edi,edi
00007ffd`1b290b15 33db            xor     ebx,ebx
00007ffd`1b290b17 4533f6          xor     r14d,r14d
00007ffd`1b290b1a 4533ff          xor     r15d,r15d
00007ffd`1b290b1d 4533e4          xor     r12d,r12d
00007ffd`1b290b20 4533ed          xor     r13d,r13d
00007ffd`1b290b23 33c0            xor     eax,eax
00007ffd`1b290b25 48894518        mov     qword ptr [rbp+18h],rax

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 207:
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_64\System\6aaf038fc5a894ddf3cbce94407fb772\System.ni.dll
00007ffd`1b290b29 48b998bee76ffd7f0000 mov rcx,offset System_ni+0x7be98 (00007ffd`6fe7be98) (MT: System.Diagnostics.Stopwatch)
00007ffd`1b290b33 e8081a535f      call    clr!JIT_TrialAllocSFastMP_InlineGetThread (00007ffd`7a7c2540)
00007ffd`1b290b38 33d2            xor     edx,edx
00007ffd`1b290b3a 48895008        mov     qword ptr [rax+8],rdx
00007ffd`1b290b3e c6401800        mov     byte ptr [rax+18h],0
00007ffd`1b290b42 48895010        mov     qword ptr [rax+10h],rdx
00007ffd`1b290b46 48894508        mov     qword ptr [rbp+8],rax
00007ffd`1b290b4a 80781800        cmp     byte ptr [rax+18h],0
00007ffd`1b290b4e 7515            jne     00007ffd`1b290b65
00007ffd`1b290b50 e8db8cea54      call    System_ni+0x339830 (00007ffd`70139830) (System.Diagnostics.Stopwatch.GetTimestamp(), mdToken: 00000000060030f3)
00007ffd`1b290b55 488b5508        mov     rdx,qword ptr [rbp+8]
00007ffd`1b290b59 48894210        mov     qword ptr [rdx+10h],rax
00007ffd`1b290b5d c6421801        mov     byte ptr [rdx+18h],1
00007ffd`1b290b61 48895508        mov     qword ptr [rbp+8],rdx
00007ffd`1b290b65 488b4508        mov     rax,qword ptr [rbp+8]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 208:
00007ffd`1b290b69 33c9            xor     ecx,ecx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 210:
00007ffd`1b290b6b 488b5518        mov     rdx,qword ptr [rbp+18h]
00007ffd`1b290b6f 48ffc2          inc     rdx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 211:
00007ffd`1b290b72 49ffc5          inc     r13

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 212:
00007ffd`1b290b75 49ffc4          inc     r12

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 213:
00007ffd`1b290b78 49ffc7          inc     r15

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 214:
00007ffd`1b290b7b 49ffc6          inc     r14

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 215:
00007ffd`1b290b7e 48ffc3          inc     rbx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 216:
00007ffd`1b290b81 48ffc7          inc     rdi

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 217:
00007ffd`1b290b84 48ffc6          inc     rsi

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 208:
00007ffd`1b290b87 ffc1            inc     ecx
00007ffd`1b290b89 81f980969800    cmp     ecx,989680h
00007ffd`1b290b8f 48895518        mov     qword ptr [rbp+18h],rdx
00007ffd`1b290b93 7cd6            jl      00007ffd`1b290b6b

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 219:
00007ffd`1b290b95 48894510        mov     qword ptr [rbp+10h],rax
00007ffd`1b290b99 488bc8          mov     rcx,rax
00007ffd`1b290b9c e80f33e554      call    System_ni+0x2e3eb0 (00007ffd`700e3eb0) (System.Diagnostics.Stopwatch.Stop(), mdToken: 00000000060030ec)
00007ffd`1b290ba1 488b4d10        mov     rcx,qword ptr [rbp+10h]
00007ffd`1b290ba5 e8361fe754      call    System_ni+0x302ae0 (00007ffd`70102ae0) (System.Diagnostics.Stopwatch.GetRawElapsedTicks(), mdToken: 00000000060030f4)
00007ffd`1b290baa 488bf0          mov     rsi,rax

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 222:
00007ffd`1b290bad 33c0            xor     eax,eax
00007ffd`1b290baf 488b7d10        mov     rdi,qword ptr [rbp+10h]
00007ffd`1b290bb3 48894708        mov     qword ptr [rdi+8],rax
00007ffd`1b290bb7 e8748cea54      call    System_ni+0x339830 (00007ffd`70139830) (System.Diagnostics.Stopwatch.GetTimestamp(), mdToken: 00000000060030f3)
00007ffd`1b290bbc 48894710        mov     qword ptr [rdi+10h],rax
00007ffd`1b290bc0 c6471801        mov     byte ptr [rdi+18h],1

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 223:
00007ffd`1b290bc4 4883c420        add     rsp,20h
00007ffd`1b290bc8 b904000000      mov     ecx,4
00007ffd`1b290bcd 6a00            push    0
00007ffd`1b290bcf 6a00            push    0
00007ffd`1b290bd1 48ffc9          dec     rcx
00007ffd`1b290bd4 75f7            jne     00007ffd`1b290bcd
00007ffd`1b290bd6 4883ec20        sub     rsp,20h
00007ffd`1b290bda 488d4c2420      lea     rcx,[rsp+20h]
00007ffd`1b290bdf 48896520        mov     qword ptr [rbp+20h],rsp

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 224:
00007ffd`1b290be3 33c0            xor     eax,eax
00007ffd`1b290be5 488d5108        lea     rdx,[rcx+8]
00007ffd`1b290be9 4c8d4110        lea     r8,[rcx+10h]
00007ffd`1b290bed 4c8d4918        lea     r9,[rcx+18h]
00007ffd`1b290bf1 4c8d5120        lea     r10,[rcx+20h]
00007ffd`1b290bf5 4c8d5928        lea     r11,[rcx+28h]
00007ffd`1b290bf9 488d5930        lea     rbx,[rcx+30h]
00007ffd`1b290bfd 4c8d7138        lea     r14,[rcx+38h]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 226:
00007ffd`1b290c01 48ff01          inc     qword ptr [rcx]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 227:
00007ffd`1b290c04 4c8bfa          mov     r15,rdx
00007ffd`1b290c07 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 228:
00007ffd`1b290c0a 4d8bf8          mov     r15,r8
00007ffd`1b290c0d 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 229:
00007ffd`1b290c10 4d8bf9          mov     r15,r9
00007ffd`1b290c13 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 230:
00007ffd`1b290c16 4d8bfa          mov     r15,r10
00007ffd`1b290c19 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 231:
00007ffd`1b290c1c 4d8bfb          mov     r15,r11
00007ffd`1b290c1f 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 232:
00007ffd`1b290c22 4c8bfb          mov     r15,rbx
00007ffd`1b290c25 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 233:
00007ffd`1b290c28 4d8bfe          mov     r15,r14
00007ffd`1b290c2b 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 224:
00007ffd`1b290c2e ffc0            inc     eax
00007ffd`1b290c30 3d80969800      cmp     eax,989680h
00007ffd`1b290c35 7cca            jl      00007ffd`1b290c01

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 235:
00007ffd`1b290c37 488bcf          mov     rcx,rdi
00007ffd`1b290c3a e87132e554      call    System_ni+0x2e3eb0 (00007ffd`700e3eb0) (System.Diagnostics.Stopwatch.Stop(), mdToken: 00000000060030ec)
00007ffd`1b290c3f 488bcf          mov     rcx,rdi
00007ffd`1b290c42 e8991ee754      call    System_ni+0x302ae0 (00007ffd`70102ae0) (System.Diagnostics.Stopwatch.GetRawElapsedTicks(), mdToken: 00000000060030f4)
00007ffd`1b290c47 488bf8          mov     rdi,rax

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 237:
00007ffd`1b290c4a 48b9a8ae0974fd7f0000 mov rcx,offset mscorlib_ni!System.Reflection.RuntimeMethodInfo.get_IsOverloaded()$##600464C <PERF> (mscorlib_ni+0x2aea8) (00007ffd`7409aea8)
00007ffd`1b290c54 e8e718535f      call    clr!JIT_TrialAllocSFastMP_InlineGetThread (00007ffd`7a7c2540)
00007ffd`1b290c59 488bd8          mov     rbx,rax
00007ffd`1b290c5c 48897308        mov     qword ptr [rbx+8],rsi
00007ffd`1b290c60 48b9a8ae0974fd7f0000 mov rcx,offset mscorlib_ni!System.Reflection.RuntimeMethodInfo.get_IsOverloaded()$##600464C <PERF> (mscorlib_ni+0x2aea8) (00007ffd`7409aea8)
00007ffd`1b290c6a e8d118535f      call    clr!JIT_TrialAllocSFastMP_InlineGetThread (00007ffd`7a7c2540)
00007ffd`1b290c6f 4c8bc0          mov     r8,rax
00007ffd`1b290c72 49897808        mov     qword ptr [r8+8],rdi
00007ffd`1b290c76 488bd3          mov     rdx,rbx
00007ffd`1b290c79 48b9903600102c020000 mov rcx,22C10003690h
00007ffd`1b290c83 488b09          mov     rcx,qword ptr [rcx]
00007ffd`1b290c86 e8c5923859      call    mscorlib_ni!System.Console.WriteLine(System.String, System.Object, System.Object)$##6000B7B (00007ffd`74619f50)

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 238:
00007ffd`1b290c8b 48b9f245d3bc9c3b0000 mov rcx,3B9CBCD345F2h
00007ffd`1b290c95 48394d00        cmp     qword ptr [rbp],rcx
00007ffd`1b290c99 7405            je      00007ffd`1b290ca0
00007ffd`1b290c9b e85054865f      call    clr!DoJITFailFast (00007ffd`7aaf60f0)
00007ffd`1b290ca0 90              nop
00007ffd`1b290ca1 488d6528        lea     rsp,[rbp+28h]
00007ffd`1b290ca5 5b              pop     rbx
00007ffd`1b290ca6 5e              pop     rsi
00007ffd`1b290ca7 5f              pop     rdi
00007ffd`1b290ca8 415c            pop     r12
00007ffd`1b290caa 415d            pop     r13
00007ffd`1b290cac 415e            pop     r14
00007ffd`1b290cae 415f            pop     r15
00007ffd`1b290cb0 5d              pop     rbp
00007ffd`1b290cb1 c3              ret

  ConsoleApp12.Program.TestSpeedInt32()
0:000> !U /d 00007ffd1b290ae0
Normal JIT generated code
ConsoleApp12.Program.TestSpeedInt64()
Begin 00007ffd1b290ae0, size 1d2
*** WARNING: Unable to verify checksum for C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\bin\x64\Release\ConsoleApp12.exe

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 206:
>>> 00007ffd`1b290ae0 55              push    rbp
00007ffd`1b290ae1 4157            push    r15
00007ffd`1b290ae3 4156            push    r14
00007ffd`1b290ae5 4155            push    r13
00007ffd`1b290ae7 4154            push    r12
00007ffd`1b290ae9 57              push    rdi
00007ffd`1b290aea 56              push    rsi
00007ffd`1b290aeb 53              push    rbx
00007ffd`1b290aec 4883ec48        sub     rsp,48h
00007ffd`1b290af0 488d6c2420      lea     rbp,[rsp+20h]
00007ffd`1b290af5 33c0            xor     eax,eax
00007ffd`1b290af7 48894500        mov     qword ptr [rbp],rax
00007ffd`1b290afb 48894520        mov     qword ptr [rbp+20h],rax
00007ffd`1b290aff 48896520        mov     qword ptr [rbp+20h],rsp
00007ffd`1b290b03 48b8f245d3bc9c3b0000 mov rax,3B9CBCD345F2h
00007ffd`1b290b0d 48894500        mov     qword ptr [rbp],rax
00007ffd`1b290b11 33f6            xor     esi,esi
00007ffd`1b290b13 33ff            xor     edi,edi
00007ffd`1b290b15 33db            xor     ebx,ebx
00007ffd`1b290b17 4533f6          xor     r14d,r14d
00007ffd`1b290b1a 4533ff          xor     r15d,r15d
00007ffd`1b290b1d 4533e4          xor     r12d,r12d
00007ffd`1b290b20 4533ed          xor     r13d,r13d
00007ffd`1b290b23 33c0            xor     eax,eax
00007ffd`1b290b25 48894518        mov     qword ptr [rbp+18h],rax

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 207:
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_64\System\6aaf038fc5a894ddf3cbce94407fb772\System.ni.dll
00007ffd`1b290b29 48b998bee76ffd7f0000 mov rcx,offset System_ni+0x7be98 (00007ffd`6fe7be98) (MT: System.Diagnostics.Stopwatch)
00007ffd`1b290b33 e8081a535f      call    clr!JIT_TrialAllocSFastMP_InlineGetThread (00007ffd`7a7c2540)
00007ffd`1b290b38 33d2            xor     edx,edx
00007ffd`1b290b3a 48895008        mov     qword ptr [rax+8],rdx
00007ffd`1b290b3e c6401800        mov     byte ptr [rax+18h],0
00007ffd`1b290b42 48895010        mov     qword ptr [rax+10h],rdx
00007ffd`1b290b46 48894508        mov     qword ptr [rbp+8],rax
00007ffd`1b290b4a 80781800        cmp     byte ptr [rax+18h],0
00007ffd`1b290b4e 7515            jne     00007ffd`1b290b65
00007ffd`1b290b50 e8db8cea54      call    System_ni+0x339830 (00007ffd`70139830) (System.Diagnostics.Stopwatch.GetTimestamp(), mdToken: 00000000060030f3)
00007ffd`1b290b55 488b5508        mov     rdx,qword ptr [rbp+8]
00007ffd`1b290b59 48894210        mov     qword ptr [rdx+10h],rax
00007ffd`1b290b5d c6421801        mov     byte ptr [rdx+18h],1
00007ffd`1b290b61 48895508        mov     qword ptr [rbp+8],rdx
00007ffd`1b290b65 488b4508        mov     rax,qword ptr [rbp+8]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 208:
00007ffd`1b290b69 33c9            xor     ecx,ecx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 210:
00007ffd`1b290b6b 488b5518        mov     rdx,qword ptr [rbp+18h]
00007ffd`1b290b6f 48ffc2          inc     rdx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 211:
00007ffd`1b290b72 49ffc5          inc     r13

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 212:
00007ffd`1b290b75 49ffc4          inc     r12

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 213:
00007ffd`1b290b78 49ffc7          inc     r15

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 214:
00007ffd`1b290b7b 49ffc6          inc     r14

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 215:
00007ffd`1b290b7e 48ffc3          inc     rbx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 216:
00007ffd`1b290b81 48ffc7          inc     rdi

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 217:
00007ffd`1b290b84 48ffc6          inc     rsi

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 208:
00007ffd`1b290b87 ffc1            inc     ecx
00007ffd`1b290b89 81f980969800    cmp     ecx,989680h
00007ffd`1b290b8f 48895518        mov     qword ptr [rbp+18h],rdx
00007ffd`1b290b93 7cd6            jl      00007ffd`1b290b6b

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 219:
00007ffd`1b290b95 48894510        mov     qword ptr [rbp+10h],rax
00007ffd`1b290b99 488bc8          mov     rcx,rax
00007ffd`1b290b9c e80f33e554      call    System_ni+0x2e3eb0 (00007ffd`700e3eb0) (System.Diagnostics.Stopwatch.Stop(), mdToken: 00000000060030ec)
00007ffd`1b290ba1 488b4d10        mov     rcx,qword ptr [rbp+10h]
00007ffd`1b290ba5 e8361fe754      call    System_ni+0x302ae0 (00007ffd`70102ae0) (System.Diagnostics.Stopwatch.GetRawElapsedTicks(), mdToken: 00000000060030f4)
00007ffd`1b290baa 488bf0          mov     rsi,rax

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 222:
00007ffd`1b290bad 33c0            xor     eax,eax
00007ffd`1b290baf 488b7d10        mov     rdi,qword ptr [rbp+10h]
00007ffd`1b290bb3 48894708        mov     qword ptr [rdi+8],rax
00007ffd`1b290bb7 e8748cea54      call    System_ni+0x339830 (00007ffd`70139830) (System.Diagnostics.Stopwatch.GetTimestamp(), mdToken: 00000000060030f3)
00007ffd`1b290bbc 48894710        mov     qword ptr [rdi+10h],rax
00007ffd`1b290bc0 c6471801        mov     byte ptr [rdi+18h],1

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 223:
00007ffd`1b290bc4 4883c420        add     rsp,20h
00007ffd`1b290bc8 b904000000      mov     ecx,4
00007ffd`1b290bcd 6a00            push    0
00007ffd`1b290bcf 6a00            push    0
00007ffd`1b290bd1 48ffc9          dec     rcx
00007ffd`1b290bd4 75f7            jne     00007ffd`1b290bcd
00007ffd`1b290bd6 4883ec20        sub     rsp,20h
00007ffd`1b290bda 488d4c2420      lea     rcx,[rsp+20h]
00007ffd`1b290bdf 48896520        mov     qword ptr [rbp+20h],rsp

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 224:
00007ffd`1b290be3 33c0            xor     eax,eax
00007ffd`1b290be5 488d5108        lea     rdx,[rcx+8]
00007ffd`1b290be9 4c8d4110        lea     r8,[rcx+10h]
00007ffd`1b290bed 4c8d4918        lea     r9,[rcx+18h]
00007ffd`1b290bf1 4c8d5120        lea     r10,[rcx+20h]
00007ffd`1b290bf5 4c8d5928        lea     r11,[rcx+28h]
00007ffd`1b290bf9 488d5930        lea     rbx,[rcx+30h]
00007ffd`1b290bfd 4c8d7138        lea     r14,[rcx+38h]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 226:
00007ffd`1b290c01 48ff01          inc     qword ptr [rcx]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 227:
00007ffd`1b290c04 4c8bfa          mov     r15,rdx
00007ffd`1b290c07 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 228:
00007ffd`1b290c0a 4d8bf8          mov     r15,r8
00007ffd`1b290c0d 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 229:
00007ffd`1b290c10 4d8bf9          mov     r15,r9
00007ffd`1b290c13 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 230:
00007ffd`1b290c16 4d8bfa          mov     r15,r10
00007ffd`1b290c19 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 231:
00007ffd`1b290c1c 4d8bfb          mov     r15,r11
00007ffd`1b290c1f 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 232:
00007ffd`1b290c22 4c8bfb          mov     r15,rbx
00007ffd`1b290c25 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 233:
00007ffd`1b290c28 4d8bfe          mov     r15,r14
00007ffd`1b290c2b 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 224:
00007ffd`1b290c2e ffc0            inc     eax
00007ffd`1b290c30 3d80969800      cmp     eax,989680h
00007ffd`1b290c35 7cca            jl      00007ffd`1b290c01

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 235:
00007ffd`1b290c37 488bcf          mov     rcx,rdi
00007ffd`1b290c3a e87132e554      call    System_ni+0x2e3eb0 (00007ffd`700e3eb0) (System.Diagnostics.Stopwatch.Stop(), mdToken: 00000000060030ec)
00007ffd`1b290c3f 488bcf          mov     rcx,rdi
00007ffd`1b290c42 e8991ee754      call    System_ni+0x302ae0 (00007ffd`70102ae0) (System.Diagnostics.Stopwatch.GetRawElapsedTicks(), mdToken: 00000000060030f4)
00007ffd`1b290c47 488bf8          mov     rdi,rax

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 237:
00007ffd`1b290c4a 48b9a8ae0974fd7f0000 mov rcx,offset mscorlib_ni!System.Reflection.RuntimeMethodInfo.get_IsOverloaded()$##600464C <PERF> (mscorlib_ni+0x2aea8) (00007ffd`7409aea8)
00007ffd`1b290c54 e8e718535f      call    clr!JIT_TrialAllocSFastMP_InlineGetThread (00007ffd`7a7c2540)
00007ffd`1b290c59 488bd8          mov     rbx,rax
00007ffd`1b290c5c 48897308        mov     qword ptr [rbx+8],rsi
00007ffd`1b290c60 48b9a8ae0974fd7f0000 mov rcx,offset mscorlib_ni!System.Reflection.RuntimeMethodInfo.get_IsOverloaded()$##600464C <PERF> (mscorlib_ni+0x2aea8) (00007ffd`7409aea8)
00007ffd`1b290c6a e8d118535f      call    clr!JIT_TrialAllocSFastMP_InlineGetThread (00007ffd`7a7c2540)
00007ffd`1b290c6f 4c8bc0          mov     r8,rax
00007ffd`1b290c72 49897808        mov     qword ptr [r8+8],rdi
00007ffd`1b290c76 488bd3          mov     rdx,rbx
00007ffd`1b290c79 48b9903600102c020000 mov rcx,22C10003690h
00007ffd`1b290c83 488b09          mov     rcx,qword ptr [rcx]
00007ffd`1b290c86 e8c5923859      call    mscorlib_ni!System.Console.WriteLine(System.String, System.Object, System.Object)$##6000B7B (00007ffd`74619f50)

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 238:
00007ffd`1b290c8b 48b9f245d3bc9c3b0000 mov rcx,3B9CBCD345F2h
00007ffd`1b290c95 48394d00        cmp     qword ptr [rbp],rcx
00007ffd`1b290c99 7405            je      00007ffd`1b290ca0
00007ffd`1b290c9b e85054865f      call    clr!DoJITFailFast (00007ffd`7aaf60f0)
00007ffd`1b290ca0 90              nop
00007ffd`1b290ca1 488d6528        lea     rsp,[rbp+28h]
00007ffd`1b290ca5 5b              pop     rbx
00007ffd`1b290ca6 5e              pop     rsi
00007ffd`1b290ca7 5f              pop     rdi
00007ffd`1b290ca8 415c            pop     r12
00007ffd`1b290caa 415d            pop     r13
00007ffd`1b290cac 415e            pop     r14
00007ffd`1b290cae 415f            pop     r15
00007ffd`1b290cb0 5d              pop     rbp
00007ffd`1b290cb1 c3              ret
  x86
  ConsoleApp12.Program.TestSpeedInt64()
0:007> !DumpMD /d 031f4e14
Method Name:  ConsoleApp12.Program.TestSpeedInt64()
Class:        031f1398
MethodTable:  031f4e38
mdToken:      06000006
Module:       031f4044
IsJitted:     yes
CodeAddr:     032809f0
Transparency: Critical
0:007> !U /d 032809f0
Normal JIT generated code
ConsoleApp12.Program.TestSpeedInt64()
Begin 032809f0, size 1b1

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 206:
>>> 032809f0 55              push    ebp
032809f1 8bec            mov     ebp,esp
032809f3 57              push    edi
032809f4 56              push    esi
032809f5 53              push    ebx
032809f6 83ec18          sub     esp,18h
032809f9 33c0            xor     eax,eax
032809fb 8945dc          mov     dword ptr [ebp-24h],eax
032809fe 8945f0          mov     dword ptr [ebp-10h],eax
03280a01 8965f0          mov     dword ptr [ebp-10h],esp
03280a04 c745dcf8f90bd5  mov     dword ptr [ebp-24h],0D50BF9F8h

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 207:
03280a0b b97453236f      mov     ecx,offset System_ni+0x45374 (6f235374) (MT: System.Diagnostics.Stopwatch)
03280a10 e8b32674fe      call    019c30c8 (JitHelp: CORINFO_HELP_NEWSFAST)
03280a15 8bf0            mov     esi,eax
03280a17 c7460400000000  mov     dword ptr [esi+4],0
03280a1e c7460800000000  mov     dword ptr [esi+8],0
03280a25 c6461400        mov     byte ptr [esi+14h],0
03280a29 c7460c00000000  mov     dword ptr [esi+0Ch],0
03280a30 c7461000000000  mov     dword ptr [esi+10h],0
03280a37 807e1400        cmp     byte ptr [esi+14h],0
03280a3b 750f            jne     03280a4c
03280a3d e8ee50176c      call    System_ni+0x205b30 (6f3f5b30) (System.Diagnostics.Stopwatch.GetTimestamp(), mdToken: 060030f3)
03280a42 89460c          mov     dword ptr [esi+0Ch],eax
03280a45 895610          mov     dword ptr [esi+10h],edx
03280a48 c6461401        mov     byte ptr [esi+14h],1

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 208:
03280a4c 33c0            xor     eax,eax
03280a4e 40              inc     eax
03280a4f 3d80969800      cmp     eax,989680h
03280a54 7cf8            jl      03280a4e

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 219:
03280a56 8bce            mov     ecx,esi
03280a58 e8d32e136c      call    System_ni+0x1c3930 (6f3b3930) (System.Diagnostics.Stopwatch.Stop(), mdToken: 060030ec)
03280a5d 8bce            mov     ecx,esi
03280a5f e8cc9d146c      call    System_ni+0x1da830 (6f3ca830) (System.Diagnostics.Stopwatch.GetRawElapsedTicks(), mdToken: 060030f4)
03280a64 8945e8          mov     dword ptr [ebp-18h],eax
03280a67 8955ec          mov     dword ptr [ebp-14h],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 222:
03280a6a c7460400000000  mov     dword ptr [esi+4],0
03280a71 c7460800000000  mov     dword ptr [esi+8],0
03280a78 e8b350176c      call    System_ni+0x205b30 (6f3f5b30) (System.Diagnostics.Stopwatch.GetTimestamp(), mdToken: 060030f3)
03280a7d 89460c          mov     dword ptr [esi+0Ch],eax
03280a80 895610          mov     dword ptr [esi+10h],edx
03280a83 c6461401        mov     byte ptr [esi+14h],1

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 223:
03280a87 b810000000      mov     eax,10h
03280a8c 6a00            push    0
03280a8e 48              dec     eax
03280a8f 75fb            jne     03280a8c
03280a91 8bc4            mov     eax,esp
03280a93 8965f0          mov     dword ptr [ebp-10h],esp
03280a96 8bc8            mov     ecx,eax

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 224:
03280a98 33db            xor     ebx,ebx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 226:
03280a9a 8b01            mov     eax,dword ptr [ecx]
03280a9c 8b5104          mov     edx,dword ptr [ecx+4]
03280a9f 83c001          add     eax,1
03280aa2 83d200          adc     edx,0
03280aa5 8901            mov     dword ptr [ecx],eax
03280aa7 895104          mov     dword ptr [ecx+4],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 227:
03280aaa 8b4108          mov     eax,dword ptr [ecx+8]
03280aad 8b510c          mov     edx,dword ptr [ecx+0Ch]
03280ab0 83c001          add     eax,1
03280ab3 83d200          adc     edx,0
03280ab6 894108          mov     dword ptr [ecx+8],eax
03280ab9 89510c          mov     dword ptr [ecx+0Ch],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 228:
03280abc 8d7910          lea     edi,[ecx+10h]
03280abf 8b07            mov     eax,dword ptr [edi]
03280ac1 8b5704          mov     edx,dword ptr [edi+4]
03280ac4 83c001          add     eax,1
03280ac7 83d200          adc     edx,0
03280aca 8907            mov     dword ptr [edi],eax
03280acc 895704          mov     dword ptr [edi+4],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 229:
03280acf 8d7918          lea     edi,[ecx+18h]
03280ad2 8b07            mov     eax,dword ptr [edi]
03280ad4 8b5704          mov     edx,dword ptr [edi+4]
03280ad7 83c001          add     eax,1
03280ada 83d200          adc     edx,0
03280add 8907            mov     dword ptr [edi],eax
03280adf 895704          mov     dword ptr [edi+4],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 230:
03280ae2 8d7920          lea     edi,[ecx+20h]
03280ae5 8b07            mov     eax,dword ptr [edi]
03280ae7 8b5704          mov     edx,dword ptr [edi+4]
03280aea 83c001          add     eax,1
03280aed 83d200          adc     edx,0
03280af0 8907            mov     dword ptr [edi],eax
03280af2 895704          mov     dword ptr [edi+4],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 231:
03280af5 8d7928          lea     edi,[ecx+28h]
03280af8 8b07            mov     eax,dword ptr [edi]
03280afa 8b5704          mov     edx,dword ptr [edi+4]
03280afd 83c001          add     eax,1
03280b00 83d200          adc     edx,0
03280b03 8907            mov     dword ptr [edi],eax
03280b05 895704          mov     dword ptr [edi+4],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 232:
03280b08 8d7930          lea     edi,[ecx+30h]
03280b0b 8b07            mov     eax,dword ptr [edi]
03280b0d 8b5704          mov     edx,dword ptr [edi+4]
03280b10 83c001          add     eax,1
03280b13 83d200          adc     edx,0
03280b16 8907            mov     dword ptr [edi],eax
03280b18 895704          mov     dword ptr [edi+4],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 233:
03280b1b 8d7938          lea     edi,[ecx+38h]
03280b1e 8b07            mov     eax,dword ptr [edi]
03280b20 8b5704          mov     edx,dword ptr [edi+4]
03280b23 83c001          add     eax,1
03280b26 83d200          adc     edx,0
03280b29 8907            mov     dword ptr [edi],eax
03280b2b 895704          mov     dword ptr [edi+4],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 224:
03280b2e 43              inc     ebx
03280b2f 81fb80969800    cmp     ebx,989680h
03280b35 0f8c5fffffff    jl      03280a9a

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 235:
03280b3b 8bce            mov     ecx,esi
03280b3d e8ee2d136c      call    System_ni+0x1c3930 (6f3b3930) (System.Diagnostics.Stopwatch.Stop(), mdToken: 060030ec)
03280b42 8bce            mov     ecx,esi
03280b44 e8e79c146c      call    System_ni+0x1da830 (6f3ca830) (System.Diagnostics.Stopwatch.GetRawElapsedTicks(), mdToken: 060030f4)
03280b49 8955e4          mov     dword ptr [ebp-1Ch],edx
03280b4c 8bd8            mov     ebx,eax

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 237:
03280b4e b90c15cf6f      mov     ecx,offset mscorlib_ni!System.Text.Encoding.GetEncodingCodePage(Int32)$##6006719 <PERF> (mscorlib_ni+0x1150c) (6fcf150c)
03280b53 e8702574fe      call    019c30c8 (JitHelp: CORINFO_HELP_NEWSFAST)
03280b58 8bf0            mov     esi,eax
03280b5a b90c15cf6f      mov     ecx,offset mscorlib_ni!System.Text.Encoding.GetEncodingCodePage(Int32)$##6006719 <PERF> (mscorlib_ni+0x1150c) (6fcf150c)
03280b5f e8642574fe      call    019c30c8 (JitHelp: CORINFO_HELP_NEWSFAST)
03280b64 8bc8            mov     ecx,eax
03280b66 8b3d4c233f04    mov     edi,dword ptr ds:[43F234Ch] ("elapsed for variable =  {0:D} \tarray = {1:D}")
03280b6c 8b45e8          mov     eax,dword ptr [ebp-18h]
03280b6f 8b55ec          mov     edx,dword ptr [ebp-14h]
03280b72 894604          mov     dword ptr [esi+4],eax
03280b75 895608          mov     dword ptr [esi+8],edx
03280b78 8bd6            mov     edx,esi
03280b7a 8b45e4          mov     eax,dword ptr [ebp-1Ch]
03280b7d 895904          mov     dword ptr [ecx+4],ebx
03280b80 894108          mov     dword ptr [ecx+8],eax
03280b83 51              push    ecx
03280b84 8bcf            mov     ecx,edi
03280b86 e82930e46c      call    mscorlib_ni!System.Console.WriteLine(System.String, System.Object, System.Object)$##6000B7B (700c3bb4)

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 238:
03280b8b 817ddcf8f90bd5  cmp     dword ptr [ebp-24h],0D50BF9F8h
03280b92 7405            je      03280b99
03280b94 e8f7ee826e      call    clr!JIT_FailFast (71aafa90)
03280b99 8d65f4          lea     esp,[ebp-0Ch]
03280b9c 5b              pop     ebx
03280b9d 5e              pop     esi
03280b9e 5f              pop     edi
03280b9f 5d              pop     ebp
03280ba0 c3              ret


  ConsoleApp12.Program.TestSpeedInt32()
0:007> !DumpMD /d 031f4e08
Method Name:  ConsoleApp12.Program.TestSpeedInt32()
Class:        031f1398
MethodTable:  031f4e38
mdToken:      06000005
Module:       031f4044
IsJitted:     yes
CodeAddr:     03280890
Transparency: Critical
0:007> !U /d 03280890
Normal JIT generated code
ConsoleApp12.Program.TestSpeedInt32()
Begin 03280890, size 149
*** WARNING: Unable to verify checksum for C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\bin\x86\Release\ConsoleApp12.exe

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 170:
>>> 03280890 55              push    ebp
03280891 8bec            mov     ebp,esp
03280893 57              push    edi
03280894 56              push    esi
03280895 53              push    ebx
03280896 83ec18          sub     esp,18h
03280899 33c0            xor     eax,eax
0328089b 8945dc          mov     dword ptr [ebp-24h],eax
0328089e 8945f0          mov     dword ptr [ebp-10h],eax
032808a1 8965f0          mov     dword ptr [ebp-10h],esp
032808a4 c745dcf8f90bd5  mov     dword ptr [ebp-24h],0D50BF9F8h

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 171:
032808ab b9284f1f03      mov     ecx,31F4F28h
032808b0 ba04050000      mov     edx,504h
032808b5 e8a62b74fe      call    019c3460 (JitHelp: CORINFO_HELP_GETSHARED_NONGCSTATIC_BASE)
*** WARNING: Unable to verify checksum for C:\Windows\assembly\NativeImages_v4.0.30319_32\System\ec6f62a404182f6fb54d32738ecb3684\System.ni.dll
032808ba b97453236f      mov     ecx,offset System_ni+0x45374 (6f235374) (MT: System.Diagnostics.Stopwatch)
032808bf e8042874fe      call    019c30c8 (JitHelp: CORINFO_HELP_NEWSFAST)
032808c4 8bf0            mov     esi,eax
032808c6 c7460400000000  mov     dword ptr [esi+4],0
032808cd c7460800000000  mov     dword ptr [esi+8],0
032808d4 c6461400        mov     byte ptr [esi+14h],0
032808d8 c7460c00000000  mov     dword ptr [esi+0Ch],0
032808df c7461000000000  mov     dword ptr [esi+10h],0
032808e6 807e1400        cmp     byte ptr [esi+14h],0
032808ea 750f            jne     032808fb
032808ec e83f52176c      call    System_ni+0x205b30 (6f3f5b30) (System.Diagnostics.Stopwatch.GetTimestamp(), mdToken: 060030f3)
032808f1 89460c          mov     dword ptr [esi+0Ch],eax
032808f4 895610          mov     dword ptr [esi+10h],edx
032808f7 c6461401        mov     byte ptr [esi+14h],1

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 172:
032808fb 33c0            xor     eax,eax
032808fd 40              inc     eax
032808fe 3d80969800      cmp     eax,989680h
03280903 7cf8            jl      032808fd

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 183:
03280905 8bce            mov     ecx,esi
03280907 e82430136c      call    System_ni+0x1c3930 (6f3b3930) (System.Diagnostics.Stopwatch.Stop(), mdToken: 060030ec)
0328090c 8bce            mov     ecx,esi
0328090e e81d9f146c      call    System_ni+0x1da830 (6f3ca830) (System.Diagnostics.Stopwatch.GetRawElapsedTicks(), mdToken: 060030f4)
03280913 8955ec          mov     dword ptr [ebp-14h],edx
03280916 8bd8            mov     ebx,eax

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 186:
03280918 c7460400000000  mov     dword ptr [esi+4],0
0328091f c7460800000000  mov     dword ptr [esi+8],0
03280926 e80552176c      call    System_ni+0x205b30 (6f3f5b30) (System.Diagnostics.Stopwatch.GetTimestamp(), mdToken: 060030f3)
0328092b 89460c          mov     dword ptr [esi+0Ch],eax
0328092e 895610          mov     dword ptr [esi+10h],edx
03280931 c6461401        mov     byte ptr [esi+14h],1

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 187:
03280935 b808000000      mov     eax,8
0328093a 6a00            push    0
0328093c 48              dec     eax
0328093d 75fb            jne     0328093a
0328093f 8bc4            mov     eax,esp
03280941 8965f0          mov     dword ptr [ebp-10h],esp

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 188:
03280944 33c9            xor     ecx,ecx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 190:
03280946 ff00            inc     dword ptr [eax]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 191:
03280948 ff4004          inc     dword ptr [eax+4]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 192:
0328094b 8d5008          lea     edx,[eax+8]
0328094e ff02            inc     dword ptr [edx]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 193:
03280950 8d500c          lea     edx,[eax+0Ch]
03280953 ff02            inc     dword ptr [edx]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 194:
03280955 8d5010          lea     edx,[eax+10h]
03280958 ff02            inc     dword ptr [edx]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 195:
0328095a 8d5014          lea     edx,[eax+14h]
0328095d ff02            inc     dword ptr [edx]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 196:
0328095f 8d5018          lea     edx,[eax+18h]
03280962 ff02            inc     dword ptr [edx]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 197:
03280964 8d501c          lea     edx,[eax+1Ch]
03280967 ff02            inc     dword ptr [edx]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 188:
03280969 41              inc     ecx
0328096a 81f980969800    cmp     ecx,989680h
03280970 7cd4            jl      03280946

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 199:
03280972 8bce            mov     ecx,esi
03280974 e8b72f136c      call    System_ni+0x1c3930 (6f3b3930) (System.Diagnostics.Stopwatch.Stop(), mdToken: 060030ec)
03280979 8bce            mov     ecx,esi
0328097b e8b09e146c      call    System_ni+0x1da830 (6f3ca830) (System.Diagnostics.Stopwatch.GetRawElapsedTicks(), mdToken: 060030f4)
03280980 8945e0          mov     dword ptr [ebp-20h],eax
03280983 8955e4          mov     dword ptr [ebp-1Ch],edx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 201:
03280986 b90c15cf6f      mov     ecx,offset mscorlib_ni!System.Text.Encoding.GetEncodingCodePage(Int32)$##6006719 <PERF> (mscorlib_ni+0x1150c) (6fcf150c)
0328098b e8382774fe      call    019c30c8 (JitHelp: CORINFO_HELP_NEWSFAST)
03280990 8bf0            mov     esi,eax
03280992 b90c15cf6f      mov     ecx,offset mscorlib_ni!System.Text.Encoding.GetEncodingCodePage(Int32)$##6006719 <PERF> (mscorlib_ni+0x1150c) (6fcf150c)
03280997 e82c2774fe      call    019c30c8 (JitHelp: CORINFO_HELP_NEWSFAST)
0328099c 8bc8            mov     ecx,eax
0328099e 8b3d4c233f04    mov     edi,dword ptr ds:[43F234Ch] ("elapsed for variable =  {0:D} \tarray = {1:D}")
032809a4 8b45ec          mov     eax,dword ptr [ebp-14h]
032809a7 895e04          mov     dword ptr [esi+4],ebx
032809aa 894608          mov     dword ptr [esi+8],eax
032809ad 8b45e0          mov     eax,dword ptr [ebp-20h]
032809b0 8b55e4          mov     edx,dword ptr [ebp-1Ch]
032809b3 894104          mov     dword ptr [ecx+4],eax
032809b6 895108          mov     dword ptr [ecx+8],edx
032809b9 51              push    ecx
032809ba 8bcf            mov     ecx,edi
032809bc 8bd6            mov     edx,esi
032809be e8f131e46c      call    mscorlib_ni!System.Console.WriteLine(System.String, System.Object, System.Object)$##6000B7B (700c3bb4)

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 202:
032809c3 817ddcf8f90bd5  cmp     dword ptr [ebp-24h],0D50BF9F8h
032809ca 7405            je      032809d1
032809cc e8bff0826e      call    clr!JIT_FailFast (71aafa90)
032809d1 8d65f4          lea     esp,[ebp-0Ch]
032809d4 5b              pop     ebx
032809d5 5e              pop     esi
032809d6 5f              pop     edi
032809d7 5d              pop     ebp
032809d8 c3              ret


Всё это получалось так: после получения резульатов на экране — код должен был отджитится, к процессу цеплялся WinDbg64 или WinDbg32 соответственно. Не студией потому, что студия вностит коррективы в процесс Jitting'а, а меня тут интересовало то, что пойдёт в релиз — что будет на машине условного пользователя.

Тут на себя обращает внимание вот что:
C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 208:
03280a4c 33c0            xor     eax,eax
03280a4e 40              inc     eax
03280a4f 3d80969800      cmp     eax,989680h
03280a54 7cf8            jl      03280a4e

это x86, как ты видишь. Т.е. цикл есть, а реально инкремента In64 vars нет — соптимизировал.

Тоже самое для In32 vars:
C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 172:
032808fb 33c0            xor     eax,eax
032808fd 40              inc     eax
032808fe 3d80969800      cmp     eax,989680h
03280903 7cf8            jl      032808fd

Самого инкремента переменных нет.

Зато в x64 он честно в цикле проинкрементил все регистры:
C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 208:
00007ffd`1b290b69 33c9            xor     ecx,ecx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 210:
00007ffd`1b290b6b 488b5518        mov     rdx,qword ptr [rbp+18h]
00007ffd`1b290b6f 48ffc2          inc     rdx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 211:
00007ffd`1b290b72 49ffc5          inc     r13

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 212:
00007ffd`1b290b75 49ffc4          inc     r12

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 213:
00007ffd`1b290b78 49ffc7          inc     r15

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 214:
00007ffd`1b290b7b 49ffc6          inc     r14

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 215:
00007ffd`1b290b7e 48ffc3          inc     rbx

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 216:
00007ffd`1b290b81 48ffc7          inc     rdi

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 217:
00007ffd`1b290b84 48ffc6          inc     rsi

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 208:
00007ffd`1b290b87 ffc1            inc     ecx
00007ffd`1b290b89 81f980969800    cmp     ecx,989680h
00007ffd`1b290b8f 48895518        mov     qword ptr [rbp+18h],rdx
00007ffd`1b290b93 7cd6            jl      00007ffd`1b290b6b


В общем, тесты с инкрементом переменных надо переделывать

С массивами при этом ничего неожиданного не произошло. Инкремент элемента массива делается классическим способом:
1)Int64
C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 229:
03280acf 8d7918          lea     edi,[ecx+18h]
03280ad2 8b07            mov     eax,dword ptr [edi]
03280ad4 8b5704          mov     edx,dword ptr [edi+4]
03280ad7 83c001          add     eax,1
03280ada 83d200          adc     edx,0
03280add 8907            mov     dword ptr [edi],eax
03280adf 895704          mov     dword ptr [edi+4],edx

2) Int64 x64 — тоже ничего необычного, за исключением плясок с бубном вокруг регистра R15. Джиттеру наверное очень нравится адресовать элемент массива с помощью именно этого регистра.
C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 230:
00007ffd`1b290c16 4d8bfa          mov     r15,r10
00007ffd`1b290c19 49ff07          inc     qword ptr [r15]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 231:
00007ffd`1b290c1c 4d8bfb          mov     r15,r11
00007ffd`1b290c1f 49ff07          inc     qword ptr [r15]


2)Int32
C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 190:
03280946 ff00            inc     dword ptr [eax]

C:\WorkingSet\sources\ConsoleApp12\ConsoleApp12\Program.cs @ 191:
03280948 ff4004          inc     dword ptr [eax+4]


Показывай, что породил FPC для 64-бит, расскажи условия тестирования.
И наконец прекрати постить текст картинками!!!111111 У меня была идея взять твои результаты, посчитать медиану и стандартную ошибку, но с картинки это сделать невозможно.
Всё сказанное выше — личное мнение, если не указано обратное.
Отредактировано 15.03.2023 3:13 Философ . Предыдущая версия . Еще …
Отредактировано 15.03.2023 3:10 Философ . Предыдущая версия .
Re[11]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.03.23 09:30
Оценка:
Здравствуйте, Aquilaware, Вы писали:

A>вы не умеете входить в ситуации окружающих людей


Я умею, но далеко не всегда хочу это делать. В частности, такого желания не возникает, когда доводы тех людей в итоге сводятся к "мне так тупо проще/удобнее, но вы должны войти в мое положение и пойти мне навстречу". При этом сам он, разумеется, в положение другого входить не намерен, и навстречу пойдет лишь в самом крайнем случае.

A>(эгоизм).


Эгоизм — это то, против чего такая позиция направлена.

A>если вам достаточно 300 Кб для программы, вы делаете вывод что всему миру этого обьема тоже достаточно


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

Безусловно, сейчас достаточно задач, требующих большого количества ресурсов. Но это — капля в море всего современного софта, которого неимоверно много. За доказательствами далеко ходить не нужно: откройте Google Play и поищите там какие-нибудь очевидно простые по функциональности приложения. Найдете много приложений на мегабайты и десятки мегабайт, и среди них (но ближе к концу списка) нередко найдете на 100-200 килобайт, функциональность которых может оказаться даже лучше.

И повторю: плохо не то, что такой мусор вообще существует. Плохо то, что он объявлен нормой, на которую ориентируются остальные. И по сути это мало чем отличается от той же Турции, где построенные за последние 10-20 лет здания внешне и внутри выглядели вполне симпатично, разве что разрушительный потенциал меньше.
Re[14]: 32 bit
От: rudzuk  
Дата: 15.03.23 09:30
Оценка:
Здравствуйте, Философ, Вы писали:

Ф> R>Ну, сильно изменился общий результат?


Ф> Для начала расскажи как запускал. Есть серьёзное подозрение, что под дебаггером.


Сборка в релиз (оптимизация O3 + отключение рантайм проверок), запуск из командной строки.

Не изменилась картина, правда? То-то же. Нефиг было гнать на GetTickCount.

Ф> ...покажи что там компилятор паскали наоптимизировал.


Асм процедуры TestSpeedIntX<Int64>:
C:\FPC\fpcupdeluxe\projects\project1.lpr:21  begin
00000001000018B0 53                       push rbx
00000001000018B1 57                       push rdi
00000001000018B2 56                       push rsi
00000001000018B3 4154                     push r12
00000001000018B5 4155                     push r13
00000001000018B7 4156                     push r14
00000001000018B9 4157                     push r15
00000001000018BB 488D642490               lea rsp,[rsp-$70]
C:\FPC\fpcupdeluxe\projects\project1.lpr:22  a := 0;
00000001000018C0 48C744246800000000       mov qword ptr [rsp+$68],$00000000
C:\FPC\fpcupdeluxe\projects\project1.lpr:23  b := 0;
00000001000018C9 4531FF                   xor r15d,r15d
C:\FPC\fpcupdeluxe\projects\project1.lpr:24  c := 0;
00000001000018CC 4531F6                   xor r14d,r14d
C:\FPC\fpcupdeluxe\projects\project1.lpr:25  d := 0;
00000001000018CF 31DB                     xor ebx,ebx
C:\FPC\fpcupdeluxe\projects\project1.lpr:26  e := 0;
00000001000018D1 31F6                     xor esi,esi
C:\FPC\fpcupdeluxe\projects\project1.lpr:27  f := 0;
00000001000018D3 31FF                     xor edi,edi
C:\FPC\fpcupdeluxe\projects\project1.lpr:28  g := 0;
00000001000018D5 4531E4                   xor r12d,r12d
C:\FPC\fpcupdeluxe\projects\project1.lpr:29  h := 0;
00000001000018D8 4531ED                   xor r13d,r13d
C:\FPC\fpcupdeluxe\projects\project1.lpr:30  VariablesIncrementTime := GetTickCount;
00000001000018DB E860FEFFFF               call -$000001A0
00000001000018E0 4889442460               mov [rsp+$60],rax
C:\FPC\fpcupdeluxe\projects\project1.lpr:31  for i := 1 to Iterations do
00000001000018E5 B880969800               mov eax,$00989680
00000001000018EA 660F1F440000             nop word ptr [rax+rax+$00]
C:\FPC\fpcupdeluxe\projects\project1.lpr:33  Inc(a);
00000001000018F0 488344246801             add qword ptr [rsp+$68],$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:34  Inc(b);
00000001000018F6 4983C701                 add r15,$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:35  Inc(c);
00000001000018FA 4983C601                 add r14,$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:36  Inc(d);
00000001000018FE 4883C301                 add rbx,$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:37  Inc(e);
0000000100001902 4883C601                 add rsi,$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:38  Inc(f);
0000000100001906 4883C701                 add rdi,$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:39  Inc(g);
000000010000190A 4983C401                 add r12,$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:40  Inc(h);
000000010000190E 4983C501                 add r13,$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:31  for i := 1 to Iterations do
0000000100001912 4883E801                 sub rax,$01
0000000100001916 75D8                     jnz -$28
C:\FPC\fpcupdeluxe\projects\project1.lpr:42  VariablesIncrementTime := GetTickCount - VariablesIncrementTime;
0000000100001918 E823FEFFFF               call -$000001DD
000000010000191D 4889C6                   mov rsi,rax
0000000100001920 482B742460               sub rsi,[rsp+$60]
C:\FPC\fpcupdeluxe\projects\project1.lpr:44  ArrayItemIncrementTime := GetTickCount;
0000000100001925 E816FEFFFF               call -$000001EA
000000010000192A 4889C7                   mov rdi,rax
C:\FPC\fpcupdeluxe\projects\project1.lpr:45  for i := 1 to Iterations do
000000010000192D B880969800               mov eax,$00989680
0000000100001932 660F1F440000             nop word ptr [rax+rax+$00]
C:\FPC\fpcupdeluxe\projects\project1.lpr:47  Inc(SmallArray[0]);
0000000100001938 488344242001             add qword ptr [rsp+$20],$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:48  Inc(SmallArray[1]);
000000010000193E 488344242801             add qword ptr [rsp+$28],$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:49  Inc(SmallArray[2]);
0000000100001944 488344243001             add qword ptr [rsp+$30],$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:50  Inc(SmallArray[3]);
000000010000194A 488344243801             add qword ptr [rsp+$38],$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:51  Inc(SmallArray[4]);
0000000100001950 488344244001             add qword ptr [rsp+$40],$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:52  Inc(SmallArray[5]);
0000000100001956 488344244801             add qword ptr [rsp+$48],$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:53  Inc(SmallArray[6]);
000000010000195C 488344245001             add qword ptr [rsp+$50],$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:54  Inc(SmallArray[7]);
0000000100001962 488344245801             add qword ptr [rsp+$58],$01
C:\FPC\fpcupdeluxe\projects\project1.lpr:45  for i := 1 to Iterations do
0000000100001968 4883E801                 sub rax,$01
000000010000196C 75CA                     jnz -$36
C:\FPC\fpcupdeluxe\projects\project1.lpr:56  ArrayItemIncrementTime := GetTickCount - ArrayItemIncrementTime;
000000010000196E E8CDFDFFFF               call -$00000233
0000000100001973 4889C3                   mov rbx,rax
0000000100001976 4829FB                   sub rbx,rdi
C:\FPC\fpcupdeluxe\projects\project1.lpr:58  WriteLn('elapsed for variable = ', VariablesIncrementTime, ' array = ', ArrayItemIncrementTime);
0000000100001979 E882A60000               call +$0000A682
000000010000197E 4889C7                   mov rdi,rax
0000000100001981 4C8D0590760100           lea r8,[rip+$00017690]
0000000100001988 4889C2                   mov rdx,rax
000000010000198B 31C9                     xor ecx,ecx
000000010000198D E88EA80000               call +$0000A88E
0000000100001992 E849690000               call +$00006949
0000000100001997 4889FA                   mov rdx,rdi
000000010000199A 4989F0                   mov r8,rsi
000000010000199D 31C9                     xor ecx,ecx
000000010000199F E8FCAA0000               call +$0000AAFC
00000001000019A4 E837690000               call +$00006937
00000001000019A9 4C8D0588760100           lea r8,[rip+$00017688]
00000001000019B0 4889FA                   mov rdx,rdi
00000001000019B3 31C9                     xor ecx,ecx
00000001000019B5 E866A80000               call +$0000A866
00000001000019BA E821690000               call +$00006921
00000001000019BF 4889FA                   mov rdx,rdi
00000001000019C2 4989D8                   mov r8,rbx
00000001000019C5 31C9                     xor ecx,ecx
00000001000019C7 E8D4AA0000               call +$0000AAD4
00000001000019CC E80F690000               call +$0000690F
00000001000019D1 4889F9                   mov rcx,rdi
00000001000019D4 E897A70000               call +$0000A797
00000001000019D9 E802690000               call +$00006902
C:\FPC\fpcupdeluxe\projects\project1.lpr:59  end;
00000001000019DE 90                       nop 
00000001000019DF 488D642470               lea rsp,[rsp+$70]
00000001000019E4 415F                     pop r15
00000001000019E6 415E                     pop r14
00000001000019E8 415D                     pop r13
00000001000019EA 415C                     pop r12
00000001000019EC 5E                       pop rsi
00000001000019ED 5F                       pop rdi
00000001000019EE 5B                       pop rbx
00000001000019EF C3                       ret
avalon/3.0.2
Re[15]: 32 bit
От: rudzuk  
Дата: 15.03.23 09:30
Оценка:
Здравствуйте, Философ, Вы писали:

Ф> Что у тебя за проц?


FX-4300

Ф> Ты под дебаггером код запускаешь что-ли?


У меня нет дотнетовских тулзов, кроме фреймворка с компилятором. Поэтому, собирал и запускал из командной строки.
avalon/3.0.2
Re[14]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 15.03.23 09:45
Оценка:
Здравствуйте, Философ, Вы писали:

Ф>Есть серьёзное подозрение, что под дебаггером.


Откуда? Отладчик, если он не безнадежно тупой, никак не взаимодействует с отлаживаемым процессом, пока тот не выполнит действие, вызывающее исключение — отладочный вывод, попадание на стоп-точку, ошибка и т.п. Если тестовый код не сыпет отладочными сообщениями сотни раз в секунду, производительность отличаться не будет.
Re[13]: 32 bit
От: rudzuk  
Дата: 15.03.23 14:43
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S> R>Я попробовал этот тест собрать паскалем с llvm, так он вообще весь код выкинул за ненадобностью


S> Статья "о ценности синтетических бенчмарков"


avalon/3.0.2
Re: 32 bit
От: Teolog  
Дата: 15.03.23 16:49
Оценка:
Здравствуйте, eustin, Вы писали:

E>Можно ли в 2023 перейти целиком на 64 бита (b2c)? Сейчас для некоторых продуктов тащится 32 Битный exe на всякий случай.


Да, скорее нужно.
SSE2 по умолчанию на всех процессорах
Больше регистров богу регистров
Отсутсвие x86 системной прослойки — влияет на скорость перого запуска после перезагрузки и потребление физической памяти, если x86 софтина единственная.
Можно выделить МНОГО памяти непрерывным куском без извращений с маппингом.
Re[15]: 32 bit
От: Sharov Россия  
Дата: 17.03.23 13:45
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:


Ф>>Есть серьёзное подозрение, что под дебаггером.

ЕМ>Откуда? Отладчик, если он не безнадежно тупой, никак не взаимодействует с отлаживаемым процессом, пока тот не выполнит действие, вызывающее исключение — отладочный вывод, попадание на стоп-точку, ошибка и т.п. Если тестовый код не сыпет отладочными сообщениями сотни раз в секунду, производительность отличаться не будет.

Для отладочный версии компилятор может генерировать не самый оптимальный код в целях улучшения диагностики. По уму, надо релизные версии сравнивать.
Кодом людям нужно помогать!
Re[16]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.03.23 13:47
Оценка:
Здравствуйте, Sharov, Вы писали:

Ф>>>Есть серьёзное подозрение, что под дебаггером.


S>Для отладочный версии компилятор может генерировать не самый оптимальный код


Запуск под отладчиком не имеет никакого отношения к генерации кода.
Re[18]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.03.23 15:37
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Под отладчиком, если без лишний действий, будет запускаться отладочная версия


"Лишних" — это каких?
Re[17]: 32 bit
От: Sharowarsheg  
Дата: 17.03.23 15:52
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Запуск под отладчиком не имеет никакого отношения к генерации кода.


Не то, чтобы я проверял, но, скажем, в MSVS 2022 есть галка в разделе Options -> Debugging, [ ] Suppress JIT optimization on module load (Managed only). Я не знаю, что она делает, но звучит подозрительно.
Отредактировано 17.03.2023 15:54 Sharowarsheg . Предыдущая версия .
Re[18]: 32 bit
От: Философ Ад http://vk.com/id10256428
Дата: 17.03.23 16:30
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>...[ ] Suppress JIT optimization on module load (Managed only). Я не знаю, что она делает, но звучит подозрительно.


Делает именно то, что написано. А ещё есть переменная среды (с разбегу не нашёл, какая именно), которая позволяет запретить загружать нативные образы из GAC. Тоже помогает при дебаге, особенно таких вещей, как WPF.
Всё сказанное выше — личное мнение, если не указано обратное.
Re[18]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.03.23 17:10
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>скажем, в MSVS 2022 есть галка в разделе Options -> Debugging, [ ] Suppress JIT optimization on module load (Managed only).


Оно и в VS 2005 есть.

S>Я не знаю, что она делает, но звучит подозрительно.


Оно тоже не имеет отношения к "запуску под отладчиком". С тем же успехом тому JIT'у можно как-то иначе передать инструкцию использовать этот режим.
Re[19]: 32 bit
От: Sharowarsheg  
Дата: 17.03.23 17:54
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Оно тоже не имеет отношения к "запуску под отладчиком". С тем же успехом тому JIT'у можно как-то иначе передать инструкцию использовать этот режим.


Насколько я понял описание вот тут —

https://learn.microsoft.com/en-us/visualstudio/debugger/jit-optimization-and-debugging?view=vs-2022

эта штука выключает (какую-то) оптимизацию при запуске под отладчиком, а без отладчика — не выключает.

Мне представляется, что это имеет отношение к запуску под отладчиком.
Re[20]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.03.23 18:18
Оценка:
Здравствуйте, Sharowarsheg, Вы писали:

S>эта штука выключает (какую-то) оптимизацию при запуске под отладчиком, а без отладчика — не выключает.

S>Мне представляется, что это имеет отношение к запуску под отладчиком.

Когда процесс запускается из студии, он всегда будет "под отладчиком" (студийным).

А еще есть IsDebuggerPresent.

Ну и уж явно нет никакого смысла кодом, генерируемым хоть каким JIT, измерять время работы команды инкремента, верно?
Re[21]: 32 bit
От: Sharowarsheg  
Дата: 17.03.23 19:38
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Когда процесс запускается из студии, он всегда будет "под отладчиком" (студийным).


В студии есть меню Debug -> Start without debugging.
Будет без отладчика. По крайней мере, без managed отладчика.

ЕМ>Ну и уж явно нет никакого смысла кодом, генерируемым хоть каким JIT, измерять время работы команды инкремента, верно?


Вообще особо нет смысла измерять время работы инкремента, но в целом, почему нет?
Re[17]: 32 bit
От: Sharov Россия  
Дата: 17.03.23 21:21
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

S>>Для отладочный версии компилятор может генерировать не самый оптимальный код

ЕМ>Запуск под отладчиком не имеет никакого отношения к генерации кода.

Сборки в dotnet имеют два осн. типа -- debug и release. Для первого типа компилятор не делает слишком много оптимизаций,
чтобы облегчить жизнь отладчику -- не инлайнит ф-ии, переменные, не удаляет недостижимый код и т.п.
Кодом людям нужно помогать!
Re[19]: 32 bit
От: Sharov Россия  
Дата: 17.03.23 21:22
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

S>>Под отладчиком, если без лишний действий, будет запускаться отладочная версия

ЕМ>"Лишних" — это каких?

Как минимум перелючение типа сборки из debug в release.
Кодом людям нужно помогать!
Re[18]: 32 bit
От: pilgrim_ Россия  
Дата: 17.03.23 21:56
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Сборки в dotnet имеют два осн. типа -- debug и release. Для первого типа компилятор не делает слишком много оптимизаций,

S>чтобы облегчить жизнь отладчику -- не инлайнит ф-ии, переменные, не удаляет недостижимый код и т.п.

Вероятно речь про jit-компилятор.

Но обсуждение началось с паскаля, компилятор которого генерит нативный код.
Re[18]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.03.23 22:08
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Сборки в dotnet имеют два осн. типа -- debug и release.


Спасибо, кэп. Только при чем здесь dotnet? Они в MS VS такие с незапамятных времен, когда dotnet еще в проекте не было.

S>Для первого типа компилятор не делает слишком много оптимизаций


Верно, только какое это имеет отношение к "запуску под отладчиком"?
Re[20]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 17.03.23 22:13
Оценка:
Здравствуйте, Sharov, Вы писали:

S>>>Под отладчиком, если без лишний действий, будет запускаться отладочная версия

ЕМ>>"Лишних" — это каких?

S>Как минимум перелючение типа сборки из debug в release.


Вставьте в программу операцию, заведомо вызывающую необрабатываемое исключение, переключите в Release, соберите и запустите. Кто обработает исключение?
Re[19]: 32 bit
От: pilgrim_ Россия  
Дата: 17.03.23 22:28
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

ЕМ>Верно, только какое это имеет отношение к "запуску под отладчиком"?


Для .NET есть разница в запуске релиза под отладчиком и без. При запуске релизной сборки (сам .NET "код" в релизе и дебаге одинаковый, для релиза просто соотв. флаг проставляется, так было в старом .NET) под отладчиком JIT генерит нативный код, отличный от того, если запустить сборку без оного. При желании посмотреть сгенерённый код без влияния отладчика использовалась техника запуска сборки (приложения) без отладчика, с дальнейшем аттачем к процессу.
Re[21]: 32 bit
От: TailWind  
Дата: 18.03.23 01:35
Оценка:
ЕМ>Ну и уж явно нет никакого смысла кодом, генерируемым хоть каким JIT, измерять время работы команды инкремента, верно?

Да там вообще непонятно почему эти инкременты не были выброшены
Дальше то они не используются
Re[20]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 18.03.23 08:20
Оценка:
Здравствуйте, pilgrim_, Вы писали:

_>Для .NET есть разница в запуске релиза под отладчиком и без. При запуске релизной сборки (сам .NET "код" в релизе и дебаге одинаковый, для релиза просто соотв. флаг проставляется, так было в старом .NET) под отладчиком JIT генерит нативный код, отличный от того, если запустить сборку без оного.


Значит, и нечего делать с помощью .NET чуждые ему вещи — в частности, измерение времени работы отдельных команд процессора.
Re[19]: 32 bit
От: Sharov Россия  
Дата: 18.03.23 18:52
Оценка:
Здравствуйте, pilgrim_, Вы писали:


S>>Сборки в dotnet имеют два осн. типа -- debug и release. Для первого типа компилятор не делает слишком много оптимизаций,

S>>чтобы облегчить жизнь отладчику -- не инлайнит ф-ии, переменные, не удаляет недостижимый код и т.п.
_>Вероятно речь про jit-компилятор.

Нет, я имел в виду как раз csc компилятор. Кстати, хороший вопрос, а знает ли jit про debug и release,
или ему это параллельно. Т.е. я знаю, что jit может методы инлайнить, но вот я не уверен, что он
может в тело методов лезть и что-то там делать\оптимизировать, это епархия csc. Но могу ошибаться.
К тому же я говорил, например, про мертвый код( размер сборки), который при release удаляется, а в debug отсается. Это точно
не про jit.

_>Но обсуждение началось с паскаля, компилятор которого генерит нативный код.


Спор зашел про дотнет, вроде Философ начал, а там и про отладочную версию программы.
Кодом людям нужно помогать!
Re[21]: 32 bit
От: Sharov Россия  
Дата: 18.03.23 18:54
Оценка:
Здравствуйте, Евгений Музыченко, Вы писали:

S>>Как минимум перелючение типа сборки из debug в release.

ЕМ>Вставьте в программу операцию, заведомо вызывающую необрабатываемое исключение, переключите в Release, соберите и запустите. Кто обработает исключение?

Могу ошибаться, но зависит от. Может отладчик подрубиться (ОС предложит запустить), если студия установлена.
В противном случае будет просто окно с ошибкой.
Кодом людям нужно помогать!
Re[22]: 32 bit
От: Евгений Музыченко Франция https://software.muzychenko.net/ru
Дата: 18.03.23 19:15
Оценка:
Здравствуйте, Sharov, Вы писали:

S>Могу ошибаться, но зависит от. Может отладчик подрубиться (ОС предложит запустить), если студия установлена.


Ничего не понял. Переключив студию в Release и собрав программу, Вы затем всегда запускаете программу независимо от студии? Если да, то зачем?
Re[7]: 32 bit
От: maks1180  
Дата: 18.03.23 20:22
Оценка:
A>Это, кстати, интересная тема. Надо бы замутить опрос по размеру выходных артефактов разрабатываемого ПО. У нас это мегабайты — десятки мегабайт. Меньше не получается, иначе полный функционал продукта невозможно реализовать.

Какой объём исходников ?
Ядро Линукс намного меньше занимает, но исходников там много!
Было бы интересно опрос провести на тему объем исходников и объём кода.
===============================================
(реклама, удалена модератором)
Re[8]: 32 bit
От: Aquilaware  
Дата: 20.03.23 06:05
Оценка:
Здравствуйте, maks1180, Вы писали:

M>Какой объём исходников ?


Посмотрел в одном из проектов — около 200000 строк, это компилируется в ~7 Mб исполняемого кода.
Re[9]: 32 bit
От: maks1180  
Дата: 21.03.23 06:36
Оценка:
A>Посмотрел в одном из проектов — около 200000 строк, это компилируется в ~7 Mб исполняемого кода.

Лучше конечно объём мерить в MB, так есть разные стили, одни пишут в 1 строку, то что некоторые в 4 строки напишут.

У меня например исходники (без картинок) 4,05 MB (из них 2,27MB исходники несколько либ), exe получился 800 KB (с картинками)
===============================================
(реклама, удалена модератором)
Отредактировано 21.03.2023 6:38 maks1180 . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.