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 Философ . Предыдущая версия .
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.