Пример кода, который показывает приведение к uint, более эффективен, чем проверка диапазона

Итак, я смотрю наэтот вопрос и общее согласие заключается в том, что версия приведения uint более эффективна, чем проверка диапазона с 0. Поскольку код также находится в реализации List в MS, я предполагаю, что это реальная оптимизация. Однако мне не удалось создать пример кода, который приведет к лучшей производительности для версии uint. Я пробовал разные тесты, и чего-то не хватает, или какая-то другая часть моего кода затягивает время для проверок. Моя последняя попытка выглядит так:

class TestType
{
    public TestType(int size)
    {
        MaxSize = size;
        Random rand = new Random(100);
        for (int i = 0; i < MaxIterations; i++)
        {
            indexes[i] = rand.Next(0, MaxSize);
        }
    }

    public const int MaxIterations = 10000000;
    private int MaxSize;
    private int[] indexes = new int[MaxIterations];

    public void Test()
    {
        var timer = new Stopwatch();

        int inRange = 0;
        int outOfRange = 0;

        timer.Start();
        for (int i = 0; i < MaxIterations; i++)
        {
            int x = indexes[i];
            if (x < 0 || x > MaxSize)
            {
                throw new Exception();

            }

            inRange += indexes[x];
        }
        timer.Stop();

        Console.WriteLine("Comparision 1: " + inRange + "/" + outOfRange + ", elapsed: " + timer.ElapsedMilliseconds + "ms");

        inRange = 0;
        outOfRange = 0;

        timer.Reset();
        timer.Start();

        for (int i = 0; i < MaxIterations; i++)
        {
            int x = indexes[i];
            if ((uint)x > (uint)MaxSize)
            {
                throw new Exception();
            }

            inRange += indexes[x];
        }

        timer.Stop();

        Console.WriteLine("Comparision 2: " + inRange + "/" + outOfRange + ", elapsed: " + timer.ElapsedMilliseconds + "ms");

    }
}

class Program
{
    static void Main()
    {
        TestType t = new TestType(TestType.MaxIterations);
        t.Test();
        TestType t2 = new TestType(TestType.MaxIterations);
        t2.Test();
        TestType t3 = new TestType(TestType.MaxIterations);
        t3.Test();
    }
}

Код немного беспорядочный, потому что я много чего пытался сделать так, чтобы проверка uint выполнялась быстрее, например, перемещение сравниваемой переменной в поле класса, генерация произвольного доступа к индексу и т. Д., Но в каждом случае результат, по-видимому, одинаков для обе версии. Так применимо ли это изменение к современным процессорам x86 и кто-то может это как-то продемонстрировать?

Обратите внимание, что я не прошу кого-то исправить мой образец или объяснить, что с ним не так. Я просто хочу увидеть случай, когда оптимизация работает.

Ответы на вопрос(2)

Ваш ответ на вопрос