2012-08-31 11 views
15

Ich möchte mein in Haskell geschriebenes Programm profilieren.Profil Haskell ohne Installation Profilerstellungsbibliotheken für alle Abhängigkeiten zu installieren

Bei der Kompilierung wurde mir mitgeteilt, dass ich keine Profiling-Bibliotheken für bestimmte Abhängigkeiten installiert habe (z. B. criterion) und cabal abbricht.

Ich habe kein Interesse, Teile dieser Abhängigkeiten zu profilieren; Code von main aufgerufen verwendet sie nicht einmal.

Wie kann ich meine Anwendung profilieren, ohne Profiling-Bibliotheken zu installieren, die ich nicht brauche, und ohne all diese Abhängigkeiten zu entfernen?

+0

Sie können nicht.Sie ​​installieren sie einfach, was ist das Problem? –

+5

1) Ich brauche sie nicht, 2) Die Installation von ihnen ist unglaublich langwierig: http://StackOverflow.com/Questions/1704421/cabal-not-installing-dependencies-wenn-brauche-Profiling-Bibliotheken – nh2

+3

Während ich zustimmen, dass es langweilig ist, ist Ihre Behauptung, dass Sie sie nicht brauchen, eindeutig falsch. –

Antwort

12

Eine gute Möglichkeit zu umgehen, kompilieren zu müssen alles mit Profiling ist Cabal Sandbox zu verwenden. Es ermöglicht Ihnen, eine Sandbox nur für eine Anwendung einzurichten, und Sie müssen nicht Ihr gesamtes ~/.cabal-Präfix neu installieren. Du brauchst eine aktuelle Version von Cabal, also starte zuerst cabal update && cabal install cabal-install.

Sobald Sie eine Sandbox initialisieren, erstellen Sie eine Datei cabal.config die erforderlichen Richtlinien enthalten (in Ihrem Fall library-profiling: True; executable-profiling: True auch praktisch sein kann.)

Ein Nebeneffekt davon ist, dass Sie Ihren Code testen können mit Abhängigkeiten, die nicht global installiert werden müssen, z. B. experimentelle Versionen oder veraltete Versionen.

EDIT: BTW, ich glaube nicht, dass Sie Profiling aktiviert für criterion funktionieren müssen. In jedem Fall funktioniert es für mich ohne Profiling wird aktiviert. Schreiben Sie einfach ein Main Modul, das main = defaultMain benchmarks enthält, wobei benchmarks den Typ [Benchmark] hat, d. H. Eine Liste von Benchmarks, die Sie geschrieben haben.

Sie dann die Datei kompilieren (sagen wir, wir nennen es benchmarks.hs mit ghc --make -o bench benchmarks.hs, und das Programm auszuführen, ./bench mit den entsprechenden Argumenten (siehe hierzu das Kriterium Dokumentation. Ein gutes Standardargument ist, sagen ./bench -o benchmarks.html, die eine raffinierte generieren Bericht ähnlich wie this one)

+0

Ich denke, die Benennung von 'Kriterium' war falsch: Es war nur ein Beispiel für eine Abhängigkeit, die ich habe, die ich nicht profilieren möchte. Ich hätte eher etwas sagen sollen wie "Meine Anwendung benutzt' hunit "zum Testen, aber ich möchte den Testcode selbst nicht profilieren und möchte daher vermeiden, das mit Profiling zu installieren" *. – nh2

+0

Das sieht derzeit nach einer zeitsparenden Lösung aus. – nh2

+0

Kriterium ist nur gut, wenn Sie zwei Funktionen * zeitweise * vergleichen möchten. Es sagt dir nicht viel über * warum * dein Code ist langsam/schnell. Um Speicherlecks oder faule Thunks zu finden, benötigen Sie immer noch eine Profilerstellung, die den '-Prof'-Schalter benötigt. –

8

Ich hatte das gleiche Problem in dieser Woche, und obwohl ich alles von Hand neu übersetzt hatte, war ich in dem IRC-Kanal, um folgende Aktionen angewiesen:

  1. Gehen Sie zu Ihrer Clique Konfigurationsdatei (in case you don't know where)
  2. bearbeiten die Leitung für ermöglichen Bibliothek Profilierung (und während Sie gerade dabei sind, ermöglichen Dokumentation)
  3. Run Cabal installieren Welt
6

Wie in der Frage erwähnten Sie beziehen sich auf In Ihrem Kommentar ist es eine gute Möglichkeit, dieses Problem in Zukunft zu lösen, indem Sie das Profiling in der Kabalenkonfiguration aktivieren. Auf diese Weise werden alle Bibliotheken mit Profiling-Unterstützung installiert. Das ist vielleicht keine befriedigende Lösung, aber ich denke, viele entscheiden sich dafür.

Wenn Sie nur einen Eindruck von der Speichernutzung Ihres Programms erhalten möchten, können Sie ein Heap-Profil Ihres Programms mit -hT generieren. Genauer gesagt müssen Sie das Programm mit -rtsopts kompilieren, um RTS-Optionen zu aktivieren, und dann mit +RTS -hT ausführen. Der Compiler generiert eine Datei mit der Erweiterung hp. Sie können die Datei hp in eine Postscript-Datei mit einem Heap-Profil konvertieren, indem Sie hp2ps verwenden. Dies sollte ohne Unterstützung von Profiling funktionieren, aber beachten Sie, dass ich zu faul bin, es zu überprüfen, da ich alle Bibliotheken mit Profiling-Unterstützung installiert habe;)

+1

Verifizierte es, es ist wahr. –

+0

Wow, du hast Recht! Heap-Profile müssen nicht "-prof" sein, daher tritt mein oben genanntes Problem nicht auf, wenn ich nur ein Space-Profiling benötige. Nett. – nh2

+3

Bitte beachten Sie, dass dies nur für '-hT' gilt, das heißt typenbasiertes Heap-Profiling. Es gibt andere Profilierungsarten wie die Profilierung von Haltevorrichtungen, die noch "prof" benötigen. –

Verwandte Themen