如何解释gprof输出

Sim*_*Sim 2 c++ gprof

我只是用gprof描述了我的程序,得到了这个:

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&)
Run Code Online (Sandbox Code Playgroud)

这让我感到困惑,因为它说使用=运算符时它使用了100.01%的时间.我是否正确地猜测这意味着它只是一直在复制数据,是否允许程序使用多少内存?

Dav*_*rtz 11

看起来您运行得太短,无法获得任何有用的数据.

方法gprof是它会定期中断您的代码,以查看您当时正在使用的功能.如果代码运行时间不长,则可能只收集少量数据点.相比之下,callgrind仪器代码和跟踪每个函数调用并返回并检查钩子之间花费的时间.即使运行时间较短,这也可以使其更加全面.这有一个缺点,它会使程序减慢很多.

另一个优点callgrind是您可以停止,启动和保存其数据收集.因此,如果您不想监视程序的启动或者只想捕获它正在执行某项操作的时间,您可以.此外,还有一个名为的工具kcachegrind可以为您提供所收集数据的精美图形视图.

如果您在运行测试时可以容忍将程序速度降低四倍,那么请使用它callgrind- 它是其中的一部分valgrind.

如果您使用的是Linux,那么您的发行版可能包含一个valgrind包和一个包kcachegrind(可能称为kdesdk或其他内容).值得投入的时间来学习如何使用它们(它们并不像开始那么容易gprof).我想你会发现它kcachegrind的GUI令人印象深刻(看看这个截图).而且,顾名思义,它也可以分析cachegrind输出.

  • "中断你的代码,看看你在那一瞬间做了什么功能,什么功能调用了它,等等"不太对.它确实看到了PC在那一瞬间的功能.它不会在那一刻查找堆栈.(如果只是这样做的话.)它的作用是每次输入一个函数时计数,哪个函数调用它.从那以后,它试图找出其他所有的东西,[成功非常有限](http://stackoverflow.com/questions/4981121/how-exactly-does-gprof-work/5046039#5046039). (3认同)