Question

Y a-t-il des bonnes façons de faire des petits executables de haskell? Avec ghc6 un programme simple Bonjour tout le monde semble venir à environ 370kb (523KB avant bande). Bonjour tout le monde en C est d'environ 4 Ko (9kB avant bande).

Était-ce utile?

La solution

Avec la branche de développement de GHC (quelqu'un sait exactement quelle version cela a été ajouté?):

$ ghc -o hello hello.hs
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello
$ du hello hello-small
700 hello
476 hello-small

Ajoutez le drapeau -dynamic pour un RTS liés dynamiquement:

$ ghc -dynamic -o hello hello.hs
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello
$ du hello hello-small
24  hello
16  hello-small

Voir aussi: http://hackage.haskell.org/trac/ghc / wiki / SharedLibraries / PlatformSupport

Pour comparaison avec C:

$ gcc hello.c -o hello
$ strip -p --strip-unneeded --remove-section=.comment -o hello-small hello
$ du hello hello-small
12  hello
8   hello-small

Autres conseils

GHC lie statiquement tout (sauf des bibliothèques utilisées par lui-même l'exécution, qui sont liés dynamiquement).

Dans les anciens âges, GHC liés l'ensemble (haskell) en dès que vous avez utilisé quelque chose. Il y a quelque temps, GHC a commencé à créer un lien « par fichier obj », ce qui a considérablement réduit la taille binaire. A en juger par la taille, vous utilisez déjà a dû être la plus récente GHC.

Du côté de plus, vous avez déjà beaucoup de choses dans les 500K, comme noyau multithread, garbage collector etc.

Ajoutez au moins éboueur à votre code C, puis les comparer à nouveau:)

La taille que vous voyez est le moteur d'exécution Haskell (libHSrts.a), qui est lié statiquement dans chaque exécutable Haskell. Si elle était un objet partagé, comme librt.o C, votre binaire serait seulement quelques k (la taille du fichier d'une scission dans la source de la bibliothèque).

Brève mise en œuvre de liaison dynamique de libHSrts.a sur votre plate-forme, vous pouvez faire vos executables plus petits par bande.

Si la taille de votre binaire importe vraiment, vous pouvez utiliser l'outil gzexe qui emballe un (de préférence déjà dépouillé) exécutable avec la compression gzip. Sur ma boîte Linux 64 bits, l'original Bonjour tout le monde programme prend 552 KB, après le décapage 393 KB, et après décapage et gzipping 125 KB. Le côté sombre de gzipping est en exécution. - l'exécutable doit être déballée premier

Vous devez compter vos bénédictions (370kb Luuuxury?):

bash$ sbcl
This is SBCL 1.0.24, an implementation of ANSI Common Lisp.

* (sb-ext:save-lisp-and-die "my.core")
[undoing binding stack and other enclosing state... done]
[saving current Lisp image into ./my.core:
...
done]
bash$ du -sh my.core 
 25M    my.core
bash$ 

Sérieusement alors que vous pouvez probablement secouer un peu les binaires haskell, il est vraiment pas une comparaison équitable avec C. Il y a plus de choses là-bas.

La dernière fois que je jouais avec GHC (ce qui pourrait être à jour), il a été tout de liens statiques, ce qui sera un facteur.

Les choses changent - garder un oeil sur cette pièce de travail en cours.

strip -p --strip-unneeded --remove-section=.comment -o your_executable_small your_executable

essayer aussi regarder ldd -Dr your_executable

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top