Meine Kopie von VS2013 Ultimate kompiliert diesen Code für mehr als 60 Sekunden:
class Program
{
static void Main(string[] args)
{
double dichotomy = Dichotomy(
d =>
{
try
{
int size = (int) d;
byte[] b = new byte[size];
return -b.Length;
}
catch (Exception)
{
return 0;
}
},
0,
int.MaxValue,
1);
Console.WriteLine(dichotomy);
Console.ReadKey();
}
private static double Dichotomy(
Func<double, double> func,
double a,
double b,
double epsilon)
{
double delta = epsilon / 10;
while (b - a >= epsilon)
{
double middle = (a + b) / 2;
double lambda = middle - delta, mu = middle + delta;
if (func(lambda) < func(mu))
b = mu;
else
a = lambda;
}
return (a + b) / 2;
}
}
Aber wenn ich ersetzen double
mit int
kompiliert es sofort. Wie kann es erklärt werden ...?
c#
.net
visual-studio
debugging
visual-studio-2013
Alex Zhukovskiy
quelle
quelle
double
und sofort mitint
. 3,4-GHz-Maschine.Antworten:
Ich repro, 27 Sekunden auf meiner Maschine. Der Übeltäter ist MsMpEng.exe, es brennt so lange 100% Kern. Einfach auf der Registerkarte Prozesse des Task-Managers zu sehen.
Dies ist der Windows Defender-Dienst, der die Malware-Scans tatsächlich ausführt. Durch Deaktivieren durch Deaktivieren der Option "Echtzeitschutz aktivieren" wird die Verzögerung sofort behoben. Das Hinzufügen des Pfads, in dem ich Projekte speichere, zum Feld "Ausgeschlossene Dateispeicherorte", wahrscheinlich Ihr bevorzugter Ansatz.
Ich würde es hassen, den zugrunde liegenden Grund erraten zu müssen, aber ich muss davon ausgehen, dass Ihr Quellcode eine Malware-Regel auslöst. Keine gute Erklärung, ich sehe keine Verzögerung, wenn ich auf eine .NET-Version <4.0 abziele. Okay, ich gebe auf :)
quelle
MSSE
und.Net 4.0+
wer die Schuldigen sindIch kann es nicht verbindlich sagen, weil es mehr als 20 Jahre her ist, seit ich auf der Ebene des Assembler-Codes herumgespielt habe, aber ich kann das leicht glauben.
Der Unterschied zwischen Gleitkommaoperationen nach IEEE-Standard und denen, die von einem Prozessor implementiert werden, erzwingt häufig die Verknüpfung in Bibliotheksroutinen, um die Übersetzung durchzuführen, während die Ganzzahlmathematik nur die CPU-Anweisungen verwenden kann. Zu der Zeit, als das IEEE den Standard definierte, trafen sie einige Entscheidungen, die bei der Implementierung sehr ungewöhnlich waren und insbesondere vor langer Zeit viel teurer in der Implementierung in Mikrocode waren, und natürlich basieren die aktuellen PC-Systeme auf Chips, die von 80387 und 80486 abstammen , die vor dem Standard liegen.
Wenn ich recht habe, ist die längere Zeit darauf zurückzuführen, dass dem Link ein Teil des Bibliothekscodes hinzugefügt wird, und die Verknüpfung ist ein großer Teil der Erstellungszeit, die tendenziell multipliziert wird, wenn verschiebbare Teile hinzugefügt werden.
Clang unter Linux kann die gleiche Verlangsamung haben oder auch nicht. Wenn es dies vermeidet und meine Vermutungen noch weiter ausdehnt, wäre dies ein Artefakt der allgegenwärtigen Shared-Memory-Bibliothek, die Sie dort erhalten, und der dazugehörigen Linker-Optimierungen.
quelle