Evet, derleyici onu iyileştiriyor.
Bir yapının hiçbir zaman boş olamayacağını bilir, bu nedenle bir nesneyi bir nesneye dönüştürmenin sonucu asla boş olamaz - bu nedenle ilk örnekte b
değerini false olarak ayarlar. Aslında, Resharper kullanırsanız, bu ifadenin her zaman yanlış olduğunu bildirir.
İkincisi için, bir null imi boş olabilir, bu yüzden kontrolü yapmak zorundadır.
(Ayrıca bu doğrulamak için derleyici tarafından oluşturulan IL kodlarını incelemek için Reflector
kullanabilirsiniz.) Derleyici null yapı her zaman boş ve irade dolayısıyla da olacağını bildiği için
orijinal test kodu iyi değil Bu döngüyü en iyi duruma getir. Sadece bu değil, bir sürüm oluştururken derleyici, b
'un kullanılmadığını ve tüm döngüyü en iyi duruma getirdiğini fark eder.
Bunu önlemek için, ve daha gerçekçi kodunda meydana şöyle test ne olacağını göstermek için: derlenmiş zaman
using System;
using System.Diagnostics;
namespace ConsoleApplication1
{
internal class Program
{
private static void Main(string[] args)
{
bool b = true;
MyStruct? s1 = getNullableStruct();
Stopwatch sw = Stopwatch.StartNew();
for (int i = 0; i < 10000000; i++)
{
b &= (object)s1 == null; // Note: Redundant cast to object.
}
Console.WriteLine(sw.Elapsed);
MyStruct s2 = getStruct();
sw.Restart();
for (int i = 0; i < 10000000; i++)
{
b &= (object)s2 == null;
}
Console.WriteLine(sw.Elapsed);
}
private static MyStruct? getNullableStruct()
{
return null;
}
private static MyStruct getStruct()
{
return new MyStruct();
}
}
public struct MyStruct {}
}
bu kod derlemek olmaz; Hata 1 İkinci döngü için atanmamış yerel değişken 's' kullanımı – Fredou
@Fredou Bu doğru. Bir yazım hatası aslında. Cevabımı bazı kıyaslamalarla güncelleyeceğim - zamanlamada – nawfal
kodunun bir hata buldum, derlendiğinde, boş döngü çalışıyormuş gibi görünüyorsun, gerçek benchmark kodunuzu yayınlamalısınız çünkü 7500ms – Fredou