.NET JIT möglichen Fehler?
Den folgenden code gibt verschiedene Ausgabe beim ausführen des release in Visual Studio, und das ausführen des release außerhalb von Visual Studio. Ich bin mit Visual Studio 2008 und targeting .NET 3.5. Ich hab auch schon versucht .NET 3.5 SP1.
Ausführung außerhalb von Visual Studio, die JIT-kick sollte. Entweder (a) gibt es etwas subtiler geht mit C#, die mir fehlt oder (b) der JIT ist tatsächlich ein Fehler vorliegt. Ich bin zweifelhaft, dass der JIT-kann schief gehen, aber ich bin keine andere Möglichkeiten...
Ausgegeben, wenn die Ausführung in Visual Studio:
0 0,
0 1,
1 0,
1 1,
Ausgabe beim ausführen release außerhalb von Visual Studio:
0 2,
0 2,
1 2,
1 2,
Was ist der Grund?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
namespace Test
{
struct IntVec
{
public int x;
public int y;
}
interface IDoSomething
{
void Do(IntVec o);
}
class DoSomething : IDoSomething
{
public void Do(IntVec o)
{
Console.WriteLine(o.x.ToString() + " " + o.y.ToString()+",");
}
}
class Program
{
static void Test(IDoSomething oDoesSomething)
{
IntVec oVec = new IntVec();
for (oVec.x = 0; oVec.x < 2; oVec.x++)
{
for (oVec.y = 0; oVec.y < 2; oVec.y++)
{
oDoesSomething.Do(oVec);
}
}
}
static void Main(string[] args)
{
Test(new DoSomething());
Console.ReadLine();
}
}
}
- Ja - wie wärs damit: Suche nach einem gravierenden Fehler in etwas so wichtig wie die .Net JIT - herzlichen Glückwunsch!
- Dies scheint zu repro in meinem 9. Dezember bauen die 4.0 framework auf x86. Ich werde es weitergeben, um die jitter-team. Danke!
- Dies ist eine der wenigen Fragen, die verdienen eine gold-Abzeichen.
- Die Tatsache, dass wir alle daran interessiert sind, diese Frage zeigt, erwarten wir nicht, dass bugs in der .NET JIT, gut gemacht Microsoft.
- Wir alle warten auf Microsoft Antworten gespannt .....
- Dies ist derzeit die höchsten Punktzahlen Frage bei StackOverflow unter jenen, die weniger als 10.000 Aufrufe.
Du musst angemeldet sein, um einen Kommentar abzugeben.
Es ist ein JIT-Optimierer-bug. Es ist unrolling der inneren Schleife, aber nicht die Aktualisierung der oVec.y-Wert korrekt:
Der Fehler verschwindet, wenn Sie lassen Sie oVec.y-Inkrement auf 4, das sind zu viele Anrufe, zu entrollen.
Eine Abhilfe ist diese:
UPDATE: re-geprüft im August 2012, dieser Fehler wurde behoben in der version 4.0.30319-jitter. Aber ist noch in der v2.0.50727 jitter. Es scheint unwahrscheinlich, dass Sie dieses Problem beheben in der alten version nach dieser langen.
Ich glaube, das ist in einem echten JIT-Kompilierung Fehler. Ich würde ein Bericht an Microsoft und sehen, was Sie sagen. Interessant fand ich, dass die x64-JIT nicht das gleiche problem haben.
Hier ist meine Lektüre von x86 JIT.
Diese sieht aus wie eine Optimierung gone bad auf mich...
Kopierte ich den code in eine neue Konsole App.
So ist es die x86 JIT falsch Generierung des Codes. Gelöscht haben meinen ursprünglichen text über die Neuanordnung von loops usw. Ein paar andere Antworten hier haben bestätigt, dass der JIT ist der Abbau der Schleife nicht korrekt, wenn auf x86.
Problem zu beheben, können Sie ändern Sie die Deklaration von IntVec von Klasse zu Klasse und es funktioniert in allen Geschmacksrichtungen.
Denke, das muss das MS-Connect....
-1 zu Microsoft!