Пример кода, который показывает приведение к 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 и кто-то может это как-то продемонстрировать?
Обратите внимание, что я не прошу кого-то исправить мой образец или объяснить, что с ним не так. Я просто хочу увидеть случай, когда оптимизация работает.