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

  • AmeriiK_HD

    AmeriiK_HD

    16 AĞUSTOS 2012
  • Greater Than Gatsby Photoshop Actions & Lightroom Presets

    Greater Than

    11 ŞUBAT 2013
  • Tomas N

    Tomas N

    14 Kasım 2010