2

我刚刚用 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%。我猜对了吗,这意味着它只是一直在复制数据,并且允许程序使用多少内存有限制吗?

4

1 回答 1

11

看起来您分析的运行时间太短而无法获得任何有用的数据。

工作方式gprof是它会定期中断您的代码,以查看您在那一刻所处的功能。如果代码运行时间不长,它可能只收集少量数据点。相反,callgrind检测您的代码并跟踪每个函数调用和返回,并检查挂钩之间花费了多少时间。即使运行时间很短,这也可以提供更全面的视图。这有一个缺点,它会大大减慢程序的速度。

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

如果您可以容忍在运行程序进行测试时将程序速度减慢四倍,请callgrind改用它——它是valgrind.

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

于 2011-10-02T04:46:46.343 回答