Скорость зависит от метода IndexOf
, а секундомер соединен при первом обращении к нему.Вы можете изменить свой код так, чтобы вызовы этих методов выходили за пределы цикла хотя бы один раз, как только вы это сделаете, чтобы все записанные времена доступа были согласованы.
Полный MCVE
static void Main(string[] args)
{
var unrelatedList = new List<int>(1) { 1 };
var jitMe = unrelatedList.IndexOf(1);
var sw = Stopwatch.StartNew();
sw.Stop();
Console.WriteLine($"Initialized {jitMe}, {sw.Elapsed.TotalMilliseconds}");
Console.WriteLine();
const int k = 1000 * 1000;
var l = new List<int>(k);
for (var i = 0; i < k; i++)
{
l.Add(i);
}
for (var i = 0; i < 10; i++)
{
sw = Stopwatch.StartNew();
var itm = l.IndexOf(0);
sw.Stop();
Console.WriteLine($"TotalMilliseconds: {sw.Elapsed.TotalMilliseconds}, {itm}");
}
Console.WriteLine("Done");
Console.ReadLine();
}
Выход
Initialized 0, 0.0015
TotalMilliseconds: 0.0005, 0
TotalMilliseconds: 0.0005, 0
TotalMilliseconds: 0.0005, 0
TotalMilliseconds: 0, 0
TotalMilliseconds: 0, 0
TotalMilliseconds: 0.0005, 0
TotalMilliseconds: 0.0005, 0
TotalMilliseconds: 0.0005, 0
TotalMilliseconds: 0.0005, 0
TotalMilliseconds: 0.0005, 0
См. Также C # JIT-компиляция и .NET и Компиляция MSIL в собственный код