Haskell: unnötiges binäres Wachstum mit Modulimporten

8

Wenn ich ein (großes) Modul auf eine der folgenden Arten in ein Hauptmodul importiere:

%Vor%

Die kompilierte Binärdatei wächst im Vergleich zu dem, wenn ich dieses Modul nicht importiere, immens. Dies geschieht unabhängig davon, ob ich etwas innerhalb dieses Moduls oder nicht im Hauptmodul verwende. Sollte der Compiler (ich verwende GHC unter Debian Testing) nicht nur in die Binärdatei einfügen, was benötigt wird, um es auszuführen?

In meinem speziellen Fall habe ich eine große Map in Mymodule, die ich nicht im Hauptmodul verwende. Selektiv importieren, was ich wirklich brauche, änderte das Wachstum der kompilierten Binärdatei nicht.

    
Josephine 08.02.2012, 17:09
quelle

1 Antwort

17

Soweit es GHC betrifft, sind Importlisten nur zur besseren Lesbarkeit vorhanden und vermeiden Namenskonflikte; Sie beeinflussen nicht, was überhaupt verlinkt ist.

Auch wenn Sie nur einige wenige Funktionen aus einer Bibliothek importiert haben, sind sie möglicherweise immer noch intern vom Hauptteil der Bibliothek abhängig. Sie sollten also nicht unbedingt erwarten, dass eine Größenreduzierung nur durch die Verwendung einiger verfügbarer Schnittstellen erfolgt im Allgemeinen.

Standardmäßig verknüpft GHC ganze Bibliotheken und nicht nur die Teile, die Sie verwenden. Sie könnten dies vermeiden, indem Sie Bibliotheken mit der Option -split-objs für GHC erstellen (oder split-objs: True in Ihre Konfigurationsdatei cabal-install ( ~/.cabal/config für Unix)), aber die Kompilierung verlangsamt und das wird von der GHC-Entwickler:

  

-split-objs

     

Sagen Sie dem Linker, dass er die einzelne Objektdatei, die normalerweise generiert werden soll, in mehrere Objektdateien aufteilt, eine pro Haskell-Funktion auf oberster Ebene oder geben Sie das Modul ein. Dies ist nur für Bibliotheken sinnvoll, wo es bedeutet, dass ausführbare Dateien, die mit der Bibliothek verbunden sind, kleiner sind, da sie nur mit den Objektdateien verknüpft sind, die sie benötigen. Das separate Zusammenstellen aller Abschnitte ist jedoch teuer, daher ist dies langsamer als normales Kompilieren. Außerdem kann die Größe der Bibliothek selbst (die .a-Datei) um einen Faktor von 2 bis 2,5 größer sein. Wir verwenden diese Funktion zum Erstellen von GHC-Bibliotheken.

     

- Das GHC-Handbuch

Dadurch werden nicht verwendete Teile von Bibliotheken, die Sie verwenden, nicht berücksichtigt, unabhängig davon, was Sie importieren.

Sie könnten auch daran interessiert sein, freigegebene Haskell-Bibliotheken zu verwenden .

    
ehird 08.02.2012, 17:16
quelle

Tags und Links