출력

2011-10-02 4 views
2

난 그냥 gprof은 내 프로그램을 프로파일이있어 gprof은 interprete하는 방법 : 그것이 = 연산자를 사용하여 시간의 100.01 %를 사용하고 있음을 말하는 것처럼, 나를 혼란출력

100.01  0.01  0.01 23118  0.43  0.43 std::vector<int, std::allocator<int> >::operator=(std::vector<int, std::allocator<int> > const&) 

합니다. 나는 이것이 데이터를 복사하는 것 뿐이며 프로그램이 사용할 수있는 메모리의 양이 제한된다는 것을 의미하는 것으로 추측 할 수 있습니까?

답변

10

유용한 데이터를 얻으려면 너무 짧은 프로파일을 작성한 것처럼 보입니다.

gprof의 작동 방식은 코드가 주기적으로 중단되어 해당 시점의 기능을 확인합니다. 코드가 매우 길게 실행되지 않으면 소수의 데이터 포인트 만 수집 할 수 있습니다. 반대로 callgrind은 코드를 계측하고 각 함수 호출을 추적하여 반환하고 후크간에 소요 된 시간을 확인합니다. 이는 달리기가 짧은 경우에도 훨씬 더 완벽한보기를 제공합니다. 이것은 단점을 가지고 있으며, 프로그램을 상당히 느리게 만듭니다.

callgrind의 또 다른 이점은 데이터 수집을 중지, 시작 및 저장할 수 있다는 것입니다. 따라서 프로그램의 시작을 감시하고 싶지 않거나 특정 일을하는 시간 만 잡으려는 경우에는 그렇게 할 수 있습니다. 또한 kcachegrind이라는 도구를 사용하면 수집 한 데이터를 그래픽으로 잘 볼 수 있습니다.

테스트를 위해 프로그램을 실행하는 동안 프로그램 속도가 느려지는 것을 허용 할 수 있다면 callgrind 대신 valgrind 부분을 사용하십시오.

Linux를 사용하는 경우 배포판에 valgrind 패키지가 있고 (kdesdk 또는 다른 이름이있을 수 있음) 패키지가있을 수 있습니다. 그것들을 사용하는 방법을 배우기 위해 투자할만한 가치가 있습니다 (그들은 gprof으로 시작하기가 쉽지 않습니다). 나는 당신이 kcachegrind의 GUI가 인상적이라고 생각합니다. (이걸보세요 screenshot). 그리고 그 이름에서 알 수 있듯이 cachegrind도 분석 할 수 있습니다.

+3

"코드를 중단하여 그 순간에 어떤 기능을 사용했는지, 어떤 기능에서이를 호출했는지 등을 파악할 수 있습니다. 그 순간에 PC가 어떤 기능을하고 있는지를 알 수 있습니다. 그 순간에 스택을 찾지 않습니다. (만약 그랬다면) 함수가 호출 될 때마다 함수가 입력 될 때마다 그것이 무엇을하는지 계산됩니다. 그로부터, 그것은 [매우 제한된 성공] (http://stackoverflow.com/questions/4981121/how-exactly-does-gprof-work/5046039#5046039)과 함께 모든 것을 알아 내려고 시도합니다. –

+0

고마워. 내 대답을 복잡하게하기보다, 나는 그 잘못된 구절을 삭제했다. –