我只是用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&)
这使我感到困惑,因为它说它使用=运算符占100.01%的时间。我正确地猜测这意味着它只是一直在复制数据,是否允许程序允许使用多少内存?
答案 0 :(得分:11)
看起来你的行程太短,无法获得任何有用的数据。
gprof
的工作方式是它会定期中断您的代码,以查看您当时正在使用的功能。如果代码运行时间不长,则可能只收集少量数据点。相反,callgrind
检测您的代码并跟踪每个函数调用并返回并检查钩子之间花费的时间。即使运行时间较短,这也可以使其更加全面。这有一个缺点,它会使程序减慢很多。
callgrind
的另一个优点是您可以停止,启动和保存其数据集合。因此,如果您不想监视程序的启动或者只想捕获它正在执行某项操作的时间,您可以。此外,还有一个名为kcachegrind
的工具,可以为您提供收集数据的精美图形视图。
如果您在运行测试时能够容忍将程序速度降低四倍,请改用callgrind
- 它是valgrind
的一部分。
如果您使用的是Linux,则您的发行版可能包含valgrind
个包和一个包含kcachegrind
的包(可能被称为kdesdk或其他内容)。值得花时间学习如何使用它们(它们不像gprof
那样容易上手。我想你会发现kcachegrind
的GUI令人印象深刻(看看screenshot)。而且,顾名思义,它也可以分析cachegrind
输出。