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

  • ☆ SUB4SUB CENTER! ☆ spam here

    ☆ SUB4SUB

    22 ŞUBAT 2010
  • Jeremy Stark

    Jeremy Stark

    23 Mayıs 2010
  • metallmanutza13

    metallmanutz

    13 NİSAN 2007