Выполнение копии метода всегда дает двукратную производительность - PullRequest
0 голосов
/ 18 января 2019

Я написал следующую тестовую программу в .Net Core 2.2, и ее выполнение на 3 разных компьютерах дает примерно одинаковый результат: второй метод выполнения всегда выполняется быстрее.

код:

using System;
using System.Diagnostics;

class Program
{
    static void Main()
    {
        for (int i = 0; i < 10; i++)
        {
            RunTest();
        }
    }

    private static void RunTest()
    {
        const long cnt = 1000000000;

        var time1 = Test1(cnt);
        var time2 = Test2(cnt);

        Console.WriteLine($"Done in: {time1} vs {time2} diff: {time1 - time2}");
    }

    private static TimeSpan Test1(long cnt)
    {
        var v = 1;
        var timer = Stopwatch.StartNew();
        for (long i = cnt; i != 0; i--)
        {
            v = RotateBit(v);
        }
        timer.Stop();

        return timer.Elapsed;
    }

    private static TimeSpan Test2(long cnt)
    {
        var v = 1;
        var timer = Stopwatch.StartNew();
        for (long i = cnt; i != 0; i--)
        {
            v = RotateBit(v);
        }
        timer.Stop();

        return timer.Elapsed;
    }

    private static int RotateBit(int v)
    {
        v = v << 1;

        if ((v & 0b0000_1111) == 0)
        {
            v = 1;
        }

        return v;
    }
}

Обратите внимание, что методы Test1 и Test2 являются абсолютными копиями. Нет счетчика, который является первым Test1 или Test2, выполненный, который выполняется первым, всегда почти в 2 раза быстрее: Done in: 00:00:00.8881566 vs 00:00:00.4706360 diff: 00:00:00.4175206, хотя метод RunTest выполняется несколько раз.

В чем может быть причина такого странного поведения?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...