C ++ 프로파일 링 (Google CPU Perf Tools)은 정확히 무엇을 측정합니까?

StackOverflow https://stackoverflow.com/questions/1003309

  •  05-07-2019
  •  | 
  •  

문제

CPU 집약적 인 응용 프로그램을 프로파일하기 위해 Google Perf 도구를 시작하려고 노력했습니다. `ofstream '을 사용하여 각 단계를 파일에 덤프하는 통계 계산입니다. 저는 C ++ 전문가가 아니기 때문에 병목 현상을 찾는 데 어려움을 겪고 있습니다. 내 첫 번째 패스는 결과를 제공합니다.

Total: 857 samples
     357  41.7%  41.7%      357  41.7% _write$UNIX2003
     134  15.6%  57.3%      134  15.6% _exp$fenv_access_off
     109  12.7%  70.0%      276  32.2% scythe::dnorm
     103  12.0%  82.0%      103  12.0% _log$fenv_access_off
      58   6.8%  88.8%       58   6.8% scythe::const_matrix_forward_iterator::operator*
      37   4.3%  93.1%       37   4.3% scythe::matrix_forward_iterator::operator*
      15   1.8%  94.9%       47   5.5% std::transform
      13   1.5%  96.4%      486  56.7% SliceStep::DoStep
      10   1.2%  97.5%       10   1.2% 0x0002726c
       5   0.6%  98.1%        5   0.6% 0x000271c7
       5   0.6%  98.7%        5   0.6% _write$NOCANCEL$UNIX2003

Slicestep :: dostep에서 모든 실제 계산이 발생하기 때문에 이것은 놀라운 일입니다. "_write $ unix2003"(이것이 무엇인지 알아낼 수있는 곳은 어디에서 찾을 수 있습니까?)는 출력 파일을 작성하여 오는 것으로 보입니다. 이제 나를 혼란스럽게하는 것은 내가 모든 outfile << "text" 진술과 실행 PPROF, 95%가 시작되었습니다 SliceStep::DoStep 그리고`_write $ unix2003 '이 사라집니다. 그러나 총 시간으로 측정 된대로 내 응용 프로그램 속도가 상승하지 않습니다. 모든 것이 1 % 미만인 속도가 높아집니다.

내가 무엇을 놓치고 있습니까?

추가 : PPROF 출력없이 outfile << 진술은 다음과 같습니다.

Total: 790 samples
     205  25.9%  25.9%      205  25.9% _exp$fenv_access_off
     170  21.5%  47.5%      170  21.5% _log$fenv_access_off
     162  20.5%  68.0%      437  55.3% scythe::dnorm
      83  10.5%  78.5%       83  10.5% scythe::const_matrix_forward_iterator::operator*
      70   8.9%  87.3%       70   8.9% scythe::matrix_forward_iterator::operator*
      28   3.5%  90.9%       78   9.9% std::transform
      26   3.3%  94.2%       26   3.3% 0x00027262
      12   1.5%  95.7%       12   1.5% _write$NOCANCEL$UNIX2003
      11   1.4%  97.1%      764  96.7% SliceStep::DoStep
       9   1.1%  98.2%        9   1.1% 0x00027253
       6   0.8%  99.0%        6   0.8% 0x000274a6

성능이 눈에 띄는 증가가 없다는 것을 제외하고는 내가 기대하는 것과 같습니다 (10 초 계산에서 .1 초). 코드는 본질적으로 다음과 같습니다.

ofstream outfile("out.txt");
for loop:
  SliceStep::DoStep()
  outfile << 'result'
outfile.close()

업데이트 : boost :: 타이머를 사용하여 타이밍을 사용하여 프로파일 러가 시작되는 곳에서 시작하고 끝나는 곳으로 끝납니다. 나는 스레드 나 멋진 것을 사용하지 않습니다.

도움이 되었습니까?

해결책

내 의견에서 :

프로파일 러에서 얻은 숫자는 인쇄문없이 프로그램이 약 40% 더 빠르지 않아야한다고 말합니다.

그러나 런타임은 거의 동일하게 유지됩니다.

분명히 측정 중 하나가 잘못되어야합니다. 즉, 더 많은 측정을 수행해야합니다.

먼저 또 다른 쉬운 도구 인 Time 명령으로 시작하는 것이 좋습니다. 이것은 당신의 시간이 지출되는 곳의 대략적인 아이디어를 얻게 될 것입니다.

결과가 여전히 결정적이지 않은 경우 더 나은 테스트 케이스가 필요합니다.

  • 더 큰 문제를 사용하십시오
  • 측정하기 전에 워밍업을하십시오. 약간의 루프를 수행하고 나중에 측정을 시작하십시오 (동일한 프로세스에서).

TIRISTAN : 모든 것이 사용자입니다. 내가하고있는 일은 매우 간단하다고 생각합니다 ... 파일이 전체 시간이 열렸다는 사실은 무엇이든 의미가 있습니까?

그것은 프로파일 러가 틀렸다는 것을 의미합니다.

파이썬을 사용하여 콘솔에 10000 줄을 인쇄하면 다음과 같은 결과가 나옵니다.

for i in xrange(100000):
    print i

콘솔로 :

time python print.py
[...]
real    0m2.370s
user    0m0.156s
sys     0m0.232s

대:

time python test.py > /dev/null

real    0m0.133s
user    0m0.116s
sys     0m0.008s

나의 요점은 다음과 같습니다.내부 측정 그리고 시간을 보여줍니다. 출력을 비활성화하여 아무것도 얻지 못합니다. Google Perf Tools는 당신이해야한다고 말합니다. 누가 틀렸어?

다른 팁

_WRRITE $ UNIX2003은 아마도 write POSIX 시스템 호출. 터미널에 출력합니다. I/O는 거의 다른 것에 비해 매우 느리기 때문에 프로그램이 약간의 출력을 작성하는 경우 많은 시간을 소비하는 것이 합리적입니다.

출력을 제거 할 때 왜 귀하의 프로그램이 속도가 상승하지 않을지 잘 모르겠지만 실제로 제공 한 정보 만 추측 할 수는 없습니다. Cout 문이 제거 될 때 일부 코드 또는 Perftools 출력을 보는 것이 좋을 것입니다.

Google Perftools는 통화 스택 샘플을 수집하므로 필요한 것은 이에 대한 가시성을 얻는 것입니다.

DOC에 따르면, 문의 그래프를 문 또는 주소 세분성에 표시 할 수 있습니다. 그것은 당신이 알아야 할 것을 말해야합니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top