Ich habe eine Anwendung, die normalerweise meldet ( time
Befehl meldet):
real 1.59
user 1.42
sys 4.73
Wenn ich jedoch eine gemeinsam genutzte Bibliothek lade und ausführe, steigt die Zeit erheblich an ( time
Befehl meldet):
real 28.51
user 106.22
sys 5.23
Während aufgrund der Arbeit meiner gemeinsam genutzten Bibliothek eine gewisse Steigerung der Ausführung zu erwarten ist (unter CentOS und Ubuntu wird eine Steigerung um das 2- bis 4-fache gemeldet – was erwartungsgemäß ist), ist die oben unter Fedora 24 gemeldete Zeit zu hoch.
Ich habe versucht, es zu verwenden perf
, und es wurde Folgendes gemeldet:
255352.948615 task-clock:u (msec) # 3.895 CPUs utilized
0 context-switches:u # 0.000 K/sec
0 cpu-migrations:u # 0.000 K/sec
18,127 page-faults:u # 0.071 K/sec
664,852,184,198 cycles:u # 2.604 GHz (50.03%)
19,323,811,463 stalled-cycles-frontend:u # 2.91% frontend cycles idle (50.02%)
578,178,881,331 stalled-cycles-backend:u # 86.96% backend cycles idle (50.02%)
110,595,196,687 instructions:u # 0.17 insn per cycle
# 5.23 stalled cycles per insn (50.00%)
28,361,633,658 branches:u # 111.068 M/sec (50.01%)
777,249,031 branch-misses:u # 2.74% of all branches (50.01%)
65.564158710 seconds time elapsed
Dies scheint zu bedeuten, dass die CPU lange Zeit im Leerlauf ist. Aber ich versuche herauszufinden, wo das im Code passiert (ich habe Zugriff auf den gesamten Quellcode sowohl meiner Anwendung als auch der betreffenden gemeinsam genutzten Bibliothek). Ich habe auch gesehen, perf report
dass die in Funktionen/Systemaufrufen aufgewendete Zeit in Prozent angegeben wird. Aber ich bin an einer noch feineren Ebene interessiert, d. h. an der/den Zeile(n) in diesen Funktionen, damit ich verstehen kann, warum.
Ich weiß, dass es nicht einfach ist, konkrete Ratschläge zu geben, da ich nicht viele Informationen zu meiner Anwendung/gemeinsam genutzten Bibliothek bereitgestellt habe. Ich suche nur nach Vorschlägen/Tools/Ideen, um herauszufinden, wo die CPU die meiste Zeit im Code verbringt (oder im Leerlauf ist).
Es ist ein Fedora 24 Linux/x86_64 mit glibc 2.23 (sowohl meine Anwendung als auch meine gemeinsam genutzte Bibliothek sind mit gcc 6.1.1 und glibc 2.23 kompiliert).
Antwort1
Dies scheint darauf hinzudeuten, dass die CPU längere Zeit im Leerlauf ist.
Ja. Und zwar 87 % der Zeit. Das heißt aber nicht, dass der Prozessor nicht an anderen Aufgaben und Prozessen arbeitet.
664,852,184,198 cycles:u # 2.604 GHz (50.03%)
19,323,811,463 stalled-cycles-frontend:u # 2.91% frontend cycles idle (50.02%)
578,178,881,331 stalled-cycles-backend:u # 86.96% backend cycles idle (50.02%)
110,595,196,687 instructions:u # 0.17 insn per cycle
Das Optimieren von Programmen zur besseren Nutzung der CPU und des Speicherzugriffs ist eine komplexe Aufgabe und ohne Code ist es unmöglich, Ihnen detaillierter zu antworten.