I'm writing a small program in C, and I want to measure it's performance.
I want to see how much time do it run in the processor and how many cache hit+misses has it made. Information about context switches and memory usage would be nice to have too.
The program takes less than a second to execute.
I like the information of /proc/[pid]/stat, but I don't know how to see it after the program has died/been killed.
Any ideas?
EDIT: I think Valgrind adds a lot of overhead. That's why I wanted a simple tool, like /proc/[pid]/stat, that is always there.
Use perf:
perf stat ./yourapp
See the kernel wiki perf tutorial for details. This uses the hardware performance counters of your CPU, so the overhead is very small.
Example from the 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
No need to load a kernel module manually, on a modern debian system (with the linux-base package) it should just work. With the 'perf record -a' / 'perf report' combo you can also do full-system profiling. Any application or library that has debugging symbols will show up with details in the report. For visualization flame graphs seem to work well.
You can also use
/usr/bin/time -v YourProgram.exe
It will show you all this information:
/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
You can also use the -f flag to format the output to fit your needs.
Please, be sure to call this program using it's full path, otherway it will call the 'time' command and that's not what you need...
Hope this helps!
The best tool for you is called valgrind. It is capable of memory profiling, call-graph building and much more.
sudo apt get install valgrind
valgrind ./yourapp
However, to obtain the time your program executed, you can use time(8)
linux utility.
time ./yourapp
来源:https://stackoverflow.com/questions/10082517/simplest-tool-to-measure-c-program-cache-hit-miss-and-cpu-time-in-linux