SORU
4 NİSAN 2011, PAZARTESİ


C &# 039#;,' operatör serbest bırakma modu optimizasyonu altında acı .NET 4?

Aşağıda basit bir test Fikstür. Ve Yayın yapılarında (VS2010, geliştirir .hata Ayıklama başarısız başarılı NET4 çözüm, x 64):

[TestFixture]
public sealed class Test
{
    [Test]
    public void TestChecker()
    {
        var checker = new Checker();
        Assert.That(checker.IsDateTime(DateTime.Now), Is.True);
    }
}

public class Checker
{
    public bool IsDateTime(object o)
    {
        return o is DateTime;
    }
}

Kod optimizasyonu bazı hasara yol açtı gibi görünüyor; eğer Yayın yapıp devre dışı bırakırsam, iyi çalışır. Bu benim için oldukça şaşırtıcı oldu. Aşağıda, ILDASM yapı 2 sürümleri sökmek için kullandım:

IL hata ayıklama:

.method public hidebysig instance bool IsDateTime(object o) cil managed
{
  // Code size       15 (0xf)
  .maxstack  2
  .locals init (bool V_0)
  IL_0000:  nop
  IL_0001:  ldarg.1
  IL_0002:  isinst     [mscorlib]System.DateTime
  IL_0007:  ldnull
  IL_0008:  cgt.un
  IL_000a:  stloc.0
  IL_000b:  br.s       IL_000d
  IL_000d:  ldloc.0
  IL_000e:  ret
} // end of method Validator::IsValid

Bırakın IL:

.method public hidebysig instance bool IsDateTime(object o) cil managed
{
  // Code size       10 (0xa)
  .maxstack  8
  IL_0000:  ldarg.1
  IL_0001:  isinst     [mscorlib]System.DateTime
  IL_0006:  ldnull
  IL_0007:  cgt.un
  IL_0009:  ret
} // end of method Validator::IsValid

Mağaza ve bir yük optimize edilmiş gibi görünüyor. Önceki sürümleri hedefleyen .NET çerçeve sorunu ortadan kaldırıyordu, ama bu sadece bir rastlantı olabilir. Bu davranışları biraz sinir bozucu buldum, kimseye derleyici düşünürdüm neden açıklayabilir güvenli farklı gözlemlenebilir davranış üreten bir optimizasyon yapmak için?

Şimdiden teşekkürler.

CEVAP
4 NİSAN 2011, PAZARTESİ


Bu hata zaten Jacob Stanley tarafından this SO question geldi. Jacob zaten reported the bug, ve Microsoft gerçekten CLR TAM zamanında bir hata olduğunu onaylamıştır. Microsoft şu açıklamayı yaptı:

Bu hata çalışma zamanı, bir sonraki sürümünde sabit olacaktır. Eğer bir hizmet paketi veya bir sonraki büyük sürüm olup olmadığını söylemek için çok erken korkuyorum.

Seni tekrar bu sorunu bildirdiği için teşekkür ederiz.

TestChecker() aşağıdaki öznitelik ekleyerek hata, bir çözüm olabilir çocuğumun da tiyatroyu:

[MethodImpl(MethodImplOptions.NoInlining)]

Bunu Paylaş:
  • Google+
  • E-Posta
Etiketler:

YORUMLAR

SPONSOR VİDEO

Rastgele Yazarlar

  • Ayite Atiwoto (superjiffrey)

    Ayite Atiwot

    29 EYLÜL 2010
  • Bryan Adams

    Bryan Adams

    30 Mart 2006
  • ChrisCrossMedia

    ChrisCrossMe

    17 EYLÜL 2009