Wie profiliere ich ein Haskell-Programm mit vielen System.Process.readProcess?

9

Ich habe ein Haskell-Multithread-Programm, das ein externes Programm mit System.Process.readProcess aufruft, und das sehr oft. Wie kann ich die Leistung messen? (um zu entscheiden, ob ich mein Programm oder das externe verbessern soll.) Wie erscheint die "externe Zeit" im Profil (+ RTS -p) oder im Eventlog (das threadscope-Bild)?

    
d8d0d65b3f7cf42 31.05.2014, 10:07
quelle

2 Antworten

0

Sie können ProcMon für diese Aufgabe verwenden.

Setzen Sie Filter auf Ihren Prozessnamen, wählen Sie nur "Prozesse und Thread-Aktivität anzeigen" und Sie können genau sehen, was mehr Zeit kostet. Sie können das Protokoll sogar für eine Langzeitüberwachung speichern und analysieren.

Ich schlage Ihnen auch vor, einen anderen Ansatz für dieses Problem zu verwenden:

  1. Kindprozess
    1. Erstellen Sie eine Schleife über main und warten Sie auf ein externes Ereignis (Socket, Pipe, etc.)
    2. Verarbeitet die Anfrage und sendet das Ergebnis
    3. Blockiere bis zur nächsten Anfrage.
  2. Hauptprozess:
    1. Erzeugen Sie einen oder mehrere untergeordnete Prozesse
    2. Senden Sie die Anfrage an ein verfügbares Kind
    3. Warte auf Antwort

Auf diese Weise werden Sie den Overhead los, der beim fortwährenden Spawn / Kill des Child-Prozesses verschwendet wird.

    
Gabriel Ciubotaru 08.06.2015 13:32
quelle
0

Haben Sie erwogen, Criterion , eine Haskell Microbenchmarking-Bibliothek, zu verwenden?

  

Diese Bibliothek bietet eine leistungsstarke, aber einfache Möglichkeit, die Softwareleistung zu messen. Es bietet sowohl einen Rahmen für das Ausführen und Analysieren von Benchmarks als auch eine Reihe von Treiberfunktionen, die das Erstellen und Ausführen von Benchmarks sowie das Analysieren ihrer Ergebnisse erleichtern.

    
babelchips 30.06.2016 16:24
quelle

Tags und Links