Empfehlungen für C-Profiler? [closed]

Lesezeit: 5 Minuten

Jeder sagt immer, Sie sollten Ihr Programm profilieren, bevor Sie Optimierungen durchführen, aber niemand beschreibt jemals, wie das geht.

Was sind Ihre Praktiken für die Profilerstellung von C-Code?

  • Welchen Compiler und welches Betriebssystem verwendest du?

    – Zum Archiv zurückgelassen

    25. November 2009 um 5:25 Uhr

Benutzeravatar von Alex Martelli
Alex Martell

Verwenden gcckompiliere und verlinke ich mit -pg (wie erklärt zB hier), fahren Sie dann fort, indem Sie das Programm ausführen (gemäß den Prinzipien, die auch unter dieser URL vorgeschlagen werden) und verwenden Sie gprof. Die Tools variieren, wenn Sie verschiedene Compiler &c verwenden, aber die URL wird auch dann noch empfohlen, für die Teile, die sich mit allgemeinen Ideen darüber befassen, wie und warum Sie Ihren Code profilieren sollten.

  • Wichtig ist, dass Ihre Anwendung unter dem Profiler so ausgeführt wird, dass sie sowohl repräsentativ für die Art und Weise ist, wie die App normalerweise verwendet wird, als auch wiederholbar. Eine spezifische Suite von Testfällen hilft dabei.

    – Café

    25. November 2009 um 12:45 Uhr

  • Auf einem eingebetteten PowerPC-Linux mit ELDK wird die Binärdatei nicht ausgeführt version GLIBC_2.16 not found

    – 3bdalla

    12. September 2019 um 6:26 Uhr

Wenn Sie Linux verwenden, dann empfehle ich die Kombination von ValGrind und CallGrind und KCacheGrind. ValGrind ist eine hervorragende Methode zum Auffinden von Speicherlecks, und die CallGrind-Erweiterung ist ein guter Profiler.

HINWEIS: Ich habe gerade gelernt dass ValGrind jetzt auch auf Mac OSX funktioniert. CallGrind und KCacheGrind wurden jedoch seit 2005 nicht mehr aktualisiert. Vielleicht möchten Sie sich das ansehen andere Frontends.

  • UPDATE 2021: Laut Valgrind-Entwicklerhinweisen (stackoverflow.com/a/51623185) gibt es nach High Sierra keine Unterstützung für MAC OS X. Verwenden Sie benutzerdefinierte Builds (github.com/LouisBrunner/valgrind-macos) oder VMs mit Linux

    – dkotenko

    27. Dezember 2021 um 14:35 Uhr

Benutzeravatar von Mike Dunlavey
Mike Dunlavey

Gut, dass du gefragt hast 🙂 Wenn es Ihnen nichts ausmacht, konträr zu sein, überprüfen Sie diese Antworten:

  • verbreitete Mythen
  • kurzer Motivator
  • tiefe Erklärung
  • Live-Beispiel

Lassen Sie mich versuchen, es auf den Punkt zu bringen:

  1. Wartet das Programm auf Sie oder warten Sie darauf? Wenn Sie nicht darauf warten müssen, haben Sie kein Problem, also lassen Sie es in Ruhe.

  2. Wenn Sie warten müssen, fahren Sie fort.

Ich empfehle Sampling, also stroboskopische Röntgenaufnahmen dessen, was das Programm tut, wenn es beschäftigt ist (nicht auf Sie wartet). Holen Sie sich zumindest Proben des Aufrufstapels, nicht nur des Programmzählers. Wenn Sie nur Samples des Programmzählers erhalten, ist es bedeutungslos, wenn Ihr Programm viel Zeit mit I/O- oder Bibliotheksroutinen verbringt, also geben Sie sich nicht damit zufrieden.

Wenn Sie viele Proben erhalten möchten, benötigen Sie einen Profiler. Wenn Sie nur wenige benötigen, funktioniert die Pause-Schaltfläche im Debugger einwandfrei. Meiner Erfahrung nach sind 20 mehr als genug und 5 reichen oft aus.

Wieso den? Angenommen, Sie haben 1000 Beispiele der Aufrufliste. Jedes Sample stellt einen Bruchteil der Zeit dar, die aufgewendet wird nur weil jede einzelne Codezeile auf dem Stack dies angefordert hat. Wenn also eine Codezeile in 557 von 1000 Samples erscheint, können Sie davon ausgehen, dass sie für 557/1000 der Zeit verantwortlich ist, geben oder nehmen Sie ein paar Samples (15). Das heißt, wenn die gesamte Ausführungszeit Sie 100 $ gekostet hat, kostet diese Zeile allein 55,70 $, geben oder nehmen Sie 1,50 $ **, also sollten Sie prüfen, ob Sie sie wirklich brauchen.

Aber brauchen Sie 1000 Proben? Wenn diese Zeile etwa 55,7 % der Zeit kostet, dann würden Sie sie bei 10 Abtastungen auf 6 davon sehen, geben oder nehmen Sie 1,5 Abtastungen. Wenn Sie also eine Aussage zu 6 von 10 Proben sehen, wissen Sie, dass es Sie ungefähr zwischen 45 und 75 US-Dollar von diesen 100 US-Dollar kostet. Selbst wenn es nur 45 $ kostet, würden Sie nicht sehen wollen, ob Sie es wirklich brauchen?

Deshalb brauchen Sie nicht viele Proben – Sie brauchen nicht viel Genauigkeit. Was Sie brauchen, ist das, was Ihnen die Stack-Samples geben – sie zeigen Ihnen genau die wertvollsten Linien zur Optimierung.

** Die Standardabweichung der Anzahl der Proben ist sqrt( f * (1-f) * nsamp ) wo f ist der Anteil der Proben, die die Linie enthalten.

  • Vielen Dank für diesen sehr aufschlussreichen Beitrag! Gibt es eine Möglichkeit, lldb dazu zu bringen, die Art von zufälliger Pause auszuführen, die dies erfordert?

    – Koz Ross

    2. Mai 2017 um 4:33 Uhr

  • @Koz: Ich kenne Ildb nicht. Ich benutze einfach jeden Debugger, der Ctrl-Break kann.

    – Mike Dunlavey

    2. Mai 2017 um 11:43 Uhr

  • Der erste Link ist tot.

    – SS Anne

    8. Oktober 2019 um 21:29 Uhr

  • @MikeDunlavey Sie sind ein 10K-Benutzer. Ich bin nicht. Weder das OP noch andere Nichtbenutzer, die möglicherweise auf der Website surfen.

    – SS Anne

    9. Oktober 2019 um 14:44 Uhr


  • Die Frage wurde gelöscht.

    – SS Anne

    13. Oktober 2019 um 16:26 Uhr

Der Vollständigkeit halber würde ich hinzufügen oprofil. Es ist besonders interessant, wenn Sie den Kernel benchmarken möchten.

Shark / Instruments (mit dtrace) sind die auf einem Mac verfügbaren Profiler. Sie sind ziemlich gut.

  • Ich mag Shark besonders. Sehr nützlich (und kostenlos!).

    – justin

    10. Dezember 2009 um 22:35 Uhr

Benutzeravatar von Alex Budovski
Alex Budowski

Visual Studio-Teamsystem kommt mit einem guten Profiler. Ebenfalls, Intel VTune ist nicht schlecht.

  • Ich mag Shark besonders. Sehr nützlich (und kostenlos!).

    – justin

    10. Dezember 2009 um 22:35 Uhr

1411060cookie-checkEmpfehlungen für C-Profiler? [closed]

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy