F # Compiler halten tote Objekte am Leben

8

Ich implementiere einige Algorithmen, die auf großen Datenmengen arbeiten (~ 250 MB - 1 GB). Dafür brauchte ich eine Schleife, um ein Benchmarking durchzuführen. Allerdings lerne ich dabei, dass F # einige unangenehme Dinge tut, von denen ich hoffe, dass einige von euch das klären können.

Hier ist mein Code (Beschreibung des Problems ist unten):

%Vor%

Hier wird die Ausgabe wie folgt aussehen:

%Vor%

Also verwirft F # in der Schleife das Ergebnis, aber wenn ich nicht in der Schleife bin, behält F # Verweise auf "tote Daten" (ich habe in der AWL nachgeschaut, und anscheinend bekommt die Klasse Program Felder für diese Daten ). Warum? Und kann ich das beheben?

Dieser Code wird außerhalb von Visual Studio und im Freigabemodus ausgeführt.

    
Lasse Espeholt 12.06.2011, 16:38
quelle

1 Antwort

17

Der Grund für dieses Verhalten ist, dass sich der F # -Compiler im globalen Bereich anders verhält als im lokalen Bereich. Eine im globalen Gültigkeitsbereich deklarierte Variable wird in ein statisches Feld umgewandelt. Eine Moduldeklaration ist eine statische Klasse mit let Deklarationen, kompiliert als fields / properties / methods.

Der einfachste Weg, das Problem zu beheben, besteht darin, den Code in eine Funktion zu schreiben:

%Vor%

... aber warum erklärt der Compiler Felder, wenn Sie den Wert nicht verwenden und nur ignore it? Das ist ziemlich interessant - die Funktion ignore ist eine sehr einfache Funktion, die inline ist, wenn Sie sie benutzen. Die Deklaration lautet let inline ignore _ = () . Beim Einfügen der Funktion deklariert der Compiler einige Variablen (um die Argumente der Funktion zu speichern).

Also, eine andere Möglichkeit, dies zu beheben, ist ignore wegzulassen und zu schreiben:

%Vor%

Sie erhalten einige Compiler-Warnungen, weil das Ergebnis des Ausdrucks nicht unit ist, aber es funktioniert. Die Verwendung einiger Funktionen und das Schreiben von Code im lokalen Bereich ist jedoch wahrscheinlich zuverlässiger.

    
Tomas Petricek 12.06.2011, 17:18
quelle

Tags und Links