najprostsze narzędzie do pomiaru C Cache hit / miss i czas procesora w Linuksie?

Piszę mały program w C i chcę zmierzyć jego wydajność.

Chcę zobaczyć, ile czasu to działa w procesorze i ile cache hit+misses ma to wykonane. Informacje o przełącznikach kontekstowych i wykorzystaniu pamięci również byłyby mile widziane.

Wykonanie programu zajmuje mniej niż sekundę.

Lubię informacje z / proc/ [pid] / stat, ale nie wiem jak je zobaczyć po śmierci/śmierci programu.

Any pomysły?

EDIT: myślę, że Valgrind dodaje sporo kosztów. Dlatego chciałem prostego narzędzia, takiego jak / proc/[pid] / stat, które zawsze tam jest.

Author: jschoi, 2012-04-10

3 answers

Użyj perf :

perf stat ./yourapp

Zobacz Kernel wiki perf tutorial Po szczegóły. Wykorzystuje to liczniki wydajności sprzętowej procesora, więc narzut jest bardzo mały.

Przykład z wiki:

perf stat -B dd if=/dev/zero of=/dev/null count=1000000

Performance counter stats for 'dd if=/dev/zero of=/dev/null count=1000000':

        5,099 cache-misses             #      0.005 M/sec (scaled from 66.58%)
      235,384 cache-references         #      0.246 M/sec (scaled from 66.56%)
    9,281,660 branch-misses            #      3.858 %     (scaled from 33.50%)
  240,609,766 branches                 #    251.559 M/sec (scaled from 33.66%)
1,403,561,257 instructions             #      0.679 IPC   (scaled from 50.23%)
2,066,201,729 cycles                   #   2160.227 M/sec (scaled from 66.67%)
          217 page-faults              #      0.000 M/sec
            3 CPU-migrations           #      0.000 M/sec
           83 context-switches         #      0.000 M/sec
   956.474238 task-clock-msecs         #      0.999 CPUs

   0.957617512  seconds time elapsed

Nie ma potrzeby ręcznego ładowania modułu jądra, na nowoczesnym systemie debian (z pakietem Linux-base) powinien on po prostu działać. Za pomocą kombinacji 'perf record-A' / 'perf report' możesz również profilować cały system. Każda aplikacja lub biblioteka, która ma debugowanie symbole pojawią się wraz ze szczegółami w raporcie. Dla wizualizacji wykresy płomienia wydają się działać dobrze.

 76
Author: maxy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-17 14:38:06

Możesz również użyć

/usr/bin/time -v YourProgram.exe

Pokaże Ci wszystkie te informacje:

/usr/bin/time -v ls
    Command being timed: "ls"
    User time (seconds): 0.00
    System time (seconds): 0.00
    Percent of CPU this job got: 60%
    Elapsed (wall clock) time (h:mm:ss or m:ss): 0:00.00
    Average shared text size (kbytes): 0
    Average unshared data size (kbytes): 0
    Average stack size (kbytes): 0
    Average total size (kbytes): 0
    Maximum resident set size (kbytes): 4080
    Average resident set size (kbytes): 0
    Major (requiring I/O) page faults: 0
    Minor (reclaiming a frame) page faults: 314
    Voluntary context switches: 1
    Involuntary context switches: 1
    Swaps: 0
    File system inputs: 0
    File system outputs: 0
    Socket messages sent: 0
    Socket messages received: 0
    Signals delivered: 0
    Page size (bytes): 4096
    Exit status: 0

Możesz także użyć flagi-f, aby sformatować wyjście zgodnie z Twoimi potrzebami.

Proszę, pamiętaj, aby wywołać ten program używając pełnej ścieżki, w przeciwnym razie wywoła polecenie 'time' I nie jest to to, czego potrzebujesz...

Mam nadzieję, że to pomoże!
 12
Author: Javi Ortiz,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-02-22 13:36:34

Najlepsze narzędzie dla Ciebie nazywa się valgrind . Jest w stanie profilować pamięć, budować wykresy wywołań i wiele więcej.

sudo apt get install valgrind
valgrind ./yourapp

Jednakże, aby uzyskać czas wykonania programu, możesz użyć time(8) narzędzia linux.

time ./yourapp
 8
Author: iehrlich,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2012-04-11 19:45:58