Информация об изменениях

Сообщение 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? Зачем она нужна? Ну кроме вычисления адреса.

В-третьих, похоже у меня есть повод тебя сильно удивить.
  код на шарпе
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? Зачем она нужна? Ну кроме вычисления адреса.

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

На дизассемблер пока нет времени — чуть-чуть позже выложу (причёсывать и расписывать его долго). Там ничего не обычного.