Прежде всего, это не .NET, оптимизированная для int
производительности, это машина , которая оптимизирована, потому что 32-битный - это собственный размер слова (если только вы не используете x64, в этом случае это long
или 64 бита).
Во-вторых, вы пишете на консоль внутри каждого цикла - это слишком дорого, чем увеличение и тестирование счетчика цикла, поэтому вы не измеряете ничего реалистичного.
В-третьих, byte
имеет диапазон до 255, поэтому вы можете выполнить цикл 254 раза (если вы попытаетесь выполнить 255, он переполнится и цикл никогда не закончится - но вам не нужно останавливаться на 128).
В-четвертых, вы нигде не выполняете около достаточно итераций для профилирования. Повторять жесткий цикл 128 или даже 254 раза бессмысленно. То, что вы должны сделать, это поместить цикл byte
/ short
/ int
в другой цикл, который повторяется гораздо большее число раз, скажем, 10 миллионов, и проверяет результаты этого.
Наконец, использование DateTime.Now
в расчетах приведет к некоторому временному «шуму» при профилировании. Вместо этого рекомендуется (и проще) использовать класс Секундомер .
Суть в том, что для этого требуется много изменений, прежде чем он станет действительным перф тестом.
Вот что я считаю более точной тестовой программой:
class Program
{
const int TestIterations = 5000000;
static void Main(string[] args)
{
RunTest("Byte Loop", TestByteLoop, TestIterations);
RunTest("Short Loop", TestShortLoop, TestIterations);
RunTest("Int Loop", TestIntLoop, TestIterations);
Console.ReadLine();
}
static void RunTest(string testName, Action action, int iterations)
{
Stopwatch sw = new Stopwatch();
sw.Start();
for (int i = 0; i < iterations; i++)
{
action();
}
sw.Stop();
Console.WriteLine("{0}: Elapsed Time = {1}", testName, sw.Elapsed);
}
static void TestByteLoop()
{
int x = 0;
for (byte b = 0; b < 255; b++)
++x;
}
static void TestShortLoop()
{
int x = 0;
for (short s = 0; s < 255; s++)
++x;
}
static void TestIntLoop()
{
int x = 0;
for (int i = 0; i < 255; i++)
++x;
}
}
Это запускает каждый цикл внутри гораздо большего цикла (5 миллионов итераций) и выполняет очень простую операцию внутри цикла (увеличивает переменную). Результаты для меня были:
Байт: истекшее время = 00: 00: 03.8949910
Короткий цикл: истекшее время = 00: 00: 03.9098782
Int Loop: Истекшее время = 00: 00: 03.2986990
Итак, заметной разницы нет.
Кроме того, убедитесь, что вы профилируете в режиме выпуска, многие люди забывают и тестируют в режиме отладки, который будет значительно менее точным.