.NET içerisinde Common Language Runtime‘ın bir parçası olan JIT compiler‘ın dizilerin index sınırları konusunda yaptığı optimizasyonlara baktık bu videoda.
JIT compiler’ı bir dizi içerisinde eğer aynı branch’te (yani farklı bir kod akışına dallanma olmadan) büyük index’li kontrolü yaptıktan sonra kendisinden küçük index’ler için ayrı bir kontrol yapmasına gerek olmayacak şekilde optimizasyon yapıyor.
Yani
arr[2] = 3;
için 2 index’i için bir karşılaştırma yaptığında, bu satırdan daha sonra aynı brach’te;
arr[1] = 3;
şeklinde bir kodunuz varsa, ben zaten 2 için kontrol ettim, 2 index’li bir elemanı olan bir dizinin 1 index’li bir elemanı her zaman vardır şeklinde düşünüp burada bir karşılaştırma yapmayarak optimizasyona gidiyor.
Tabi bu optimizasyon farklı branch’lerde mevcut değil.
Videodaki kod bloğu;
public void M(int[] arr)
{
arr[0] = 1;
arr[1] = 2;
arr[2] = 3;
}
public void M1(int[] arr)
{
arr[2] = 1;
arr[1] = 2;
arr[0] = 3;
}
public void M(int[] arr, int i)
{
if(i == 1)
{
arr[0] = 1;
arr[1] = 1;
}
else if(i == 2)
{
arr[0] = 1;
}
}
Kaynaklar:
https://github.com/dotnet/coreclr/blob/master/src/jit/rangecheck.cpp
https://en.wikipedia.org/wiki/Branch_predictor