41

C로 작은 프로그램을 만들고 있는데 성능을 측정하고 싶습니다.리눅스에서 C 프로그램 캐시 히트/미스 및 CPU 시간을 측정하는 가장 간단한 도구는 무엇입니까?

얼마나 많은 시간을 프로세서에서 실행하고 얼마나 많은 캐시 적중 + 누락을했는지 알고 싶습니다. 컨텍스트 스위치 및 메모리 사용에 대한 정보도 유용 할 것입니다.

프로그램 실행에 걸리는 시간이 1 초 미만입니다.

나는/proc/[pid]/stat의 정보를 좋아하지만, 프로그램이 죽거나 죽은 후에 그것을 보는 법을 모르겠습니다.

아이디어가 있으십니까?

편집 : 나는 Valgrind가 많은 오버 헤드를 추가한다고 생각합니다. 그래서 나는 항상/proc/[pid]/stat와 같은 간단한 도구를 원했습니다.

+0

이와 비슷한 제품을 찾고 계십니까? http://software.intel.com/en-us/articles/intel-performance-counter-monitor/ – harold

답변

66

사용 반환 한 :

perf stat ./yourapp 

은 자세한 내용은 kernel wiki perf tutorial를 참조하십시오. 이것은 CPU의 하드웨어 성능 카운터를 사용하므로 오버 헤드가 매우 적습니다. 위키에서

예 :

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 

(리눅스 기반 패키지) 현대 데비안 시스템에서 수동으로 커널 모듈을로드 할 필요가 없습니다 그냥 작동합니다. 'perf record -a'/ 'perf report'콤보를 사용하면 전체 시스템 프로파일 링을 수행 할 수도 있습니다. 디버깅 기호가있는 응용 프로그램이나 라이브러리는 보고서에 세부 정보와 함께 표시됩니다. 시각화를 위해 flame graphs 잘 작동하는 것 같습니다.

7

가장 적합한 도구는 valgrind입니다. 메모리 프로파일 링, 콜 그래프 작성 등의 기능을 제공합니다.

sudo apt get install valgrind 
valgrind ./yourapp 

그러나 프로그램 실행 시간을 얻으려면 time(8) Linux 유틸리티를 사용할 수 있습니다.

time ./yourapp 
+0

은 측정 값 캐시 또는 주요 메모리 만 valgrind 할 수 있습니까? – jperelli

+1

내가 아는 한, valgrind는 모든 캐시 레벨, 적어도 L1과 L2를 측정 할 수 있습니다. – iehrlich

+3

캐시를 측정하는 cachegrind라는 Valgrind 모듈이 있습니다. –

10

또한

/usr/bin/time -v YourProgram.exe 

그것은 당신에게 모든 정보를 표시합니다 사용할 수 있습니다

/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 

당신은 또한 당신의 요구에 맞게 출력 포맷을 -f 플래그를 사용할 수 있습니다.

는 ... 그것은 '시간'명령을 호출하고 필요한 게 아니에요이 도움이

희망을 otherway, 그것은 전체 경로의 사용이 프로그램을 호출해야합니다주세요!

+7

'/ usr/bin/time! = time'을주의하는 것이 도움이됩니다. bash에서 'time'은 내장 쉘 키워드입니다. – jperelli

+9

그러나 캐시 누락은 어디에 있습니까? –

+3

대답은 캐시 미스와 아무런 관련이 없습니다. –

관련 문제