Ich habe ein Tool geschrieben, das eine C # -Quelldatei generiert, die die Ergebnisse einer prozessorintensiven Berechnung enthält (die Vorberechnung des Ergebnisses beschleunigt die Startzeit meiner Anwendung um ungefähr 15 Minuten). Es ist ein byte[]
, das so aussieht:
Ich frage mich jedoch, gibt es versteckte Kosten für das Codieren des Ergebnisses in Code, anstatt es in eine Binärdatei zu schreiben? Insbesondere befürchte ich, dass C # zwei Kopien der Daten im RAM speichert. eine Kopie mit allen Anweisungen / Code zum Erstellen von precomputedData
(zu Reflexionszwecken) und eine weitere Kopie mit dem tatsächlichen Ergebnis der Erstellung von precomputedData
. Ist das genau? Oder ist die Wahl zwischen Festcodierung oder Speicherung in einer Binärdatei, rein vorzugs- weise?
Ich habe ein kleines Testprogramm geschrieben und den IL-Code angeschaut. Mit einem statischen Feld wird ein statischer Konstruktor erzeugt, der dieses Feld initialisiert. Für Arrays gibt es eine wirklich schöne Erklärung in diesem Blogbeitrag über Wie C # Array Initialiers arbeiten von Bart De Smet.
%Vor% Das Feld <PrivateImplementationDetails>...$$method
ist als
Soweit ich das beurteilen kann, bedeutet dies, dass die Daten direkt aus dem PE-Image initialisiert werden.
Ob dies eine gute Praxis ist oder nicht, ist eine andere Frage.
Der Vorteil der Festcodierung besteht darin, dass die Daten sehr einfach zu laden sind und es schwierig ist, die Daten zu manipulieren, da sie in die Datei eingebettet sind, die signiert werden kann. Der Nachteil ist natürlich, dass jede Änderung der vorberechneten Daten bedeutet, dass Sie das Projekt neu kompilieren müssen.
Ich würde wahrscheinlich eine binäre Datei verwenden, um die Daten zu speichern, es sei denn, ich hätte mir wirklich Sorgen darüber gemacht, dass jemand die vorberechneten Daten mit böswilliger Absicht ändert. Das Laden ist nur etwas komplexer als das statische Feld, und ich würde die Möglichkeit schätzen, die Daten ohne Neukompilierung zu ändern.
In Bezug auf die Leistung, insbesondere in dieser Detaillierungsstufe, sollten keine Annahmen gemacht werden. Ich würde vorschlagen, Ihre Daten in eine Binärdatei zu legen, die Leistung Ihrer Operation zu messen und dann Ihre Schlussfolgerungen zu ziehen. Natürlich hängt dieser Prozess stark vom binären Dateiformat ab, da er wahllosen Datenzugriff usw. erlauben / verbieten kann.
Für binäre Daten würde ich vorschlagen, etwas HDF5 für große numerische Daten zu verwenden. Dies wäre eine viel sauberere Lösung aus Sicht der Softwaretechnik. In Bezug auf die Leistung müssten Sie sie vergleichen, indem Sie einen Profiler oder etwas ...
Ich hoffe, ich habe geholfen!
Tags und Links c#