Сообщение Re[5]: 32 bit от 14.03.2023 3:20
Изменено 14.03.2023 3:23 Философ
Re[5]: 32 bit
Здравствуйте, TailWind, Вы писали:
TW>INT64 + INT64
TW>Или INT64 ++
TW>32-bit compiler разложит на несколько инструкций
TW>А 64-bit compiler сделает за одну
Во-первых, AMD64 всё ещё нативно исполняет 32-битный код. Возражение не принято.
Во-вторых, как много у тебя математики на int64? Зачем она нужна? Ну кроме вычисления адреса.
В-третьих, похоже у меня есть повод тебя сильно удивить.
Занимательные результаты, правда!? Конечно же инкремент int64 в x86 медленнее чем int32 — это логично. Но, во-первых код под x64 прям заметно медленнее, а во-вторых даже на x64 инкремент int64 в x86 медленнее чем int32. Притом существенно медленнее!!!
Процессор-то не так прост оказывается..
На дизассемблер пока нет времени — чуть-чуть позже выложу (причёсывать и расписывать его долго). Там ничего не обычного.
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. Притом существенно медленнее!!!
Процессор-то не так прост оказывается..
На дизассемблер пока нет времени — чуть-чуть позже выложу (причёсывать и расписывать его долго). Там ничего не обычного.
Re[5]: 32 bit
Здравствуйте, TailWind, Вы писали:
TW>INT64 + INT64
TW>Или INT64 ++
TW>32-bit compiler разложит на несколько инструкций
TW>А 64-bit compiler сделает за одну
Во-первых, AMD64 всё ещё нативно исполняет 32-битный код. Возражение не принято.
Во-вторых, как много у тебя математики на int64? Зачем она нужна? Ну кроме вычисления адреса.
В-третьих, похоже у меня есть повод тебя сильно удивить.
Занимательные результаты, правда!? Конечно же инкремент int64 в x86 медленнее чем int32 — это логично. Но, во-первых код под x64 прям заметно медленнее, а во-вторых даже на x64 инкремент int64 в x86 медленнее чем int32. Притом существенно медленнее!!!
Процессор-то не так прост оказывается..
На дизассемблер пока нет времени — чуть-чуть позже выложу (причёсывать и расписывать его долго). Там ничего не обычного.
TW>INT64 + INT64
TW>Или INT64 ++
TW>32-bit compiler разложит на несколько инструкций
TW>А 64-bit compiler сделает за одну
Во-первых, AMD64 всё ещё нативно исполняет 32-битный код. Возражение не принято.
Во-вторых, как много у тебя математики на int64? Зачем она нужна? Ну кроме вычисления адреса.
В-третьих, похоже у меня есть повод тебя сильно удивить.
код на шарпе | |
| |
результаты теста на .net 4.8 | |
| |
Занимательные результаты, правда!? Конечно же инкремент int64 в x86 медленнее чем int32 — это логично. Но, во-первых код под x64 прям заметно медленнее, а во-вторых даже на x64 инкремент int64 в x86 медленнее чем int32. Притом существенно медленнее!!!
Процессор-то не так прост оказывается..
На дизассемблер пока нет времени — чуть-чуть позже выложу (причёсывать и расписывать его долго). Там ничего не обычного.