【问题标题】:gprof profiler does not print the time summarygprof 探查器不打印时间摘要
【发布时间】:2013-06-04 00:06:11
【问题描述】:

我创建了一个简单的程序:

#include <unistd.h>

void ssleep(unsigned int s)
{
  usleep(1000000*s);
}

int main(int, char**)
{
  ssleep(1);
}

在这些命令之后:

sch@sch-K52F:~/test$ g++ -pedantic -Wall main.cpp -pg
sch@sch-K52F:~/test$ ./a.out 
sch@sch-K52F:~/test$ gprof -b a.out > profile

我得到一份没有时间摘要的个人资料:

  %   cumulative   self              self     total           
 time   seconds   seconds    calls  Ts/call  Ts/call  name    
  0.00      0.00     0.00        1     0.00     0.00  ssleep(unsigned int)

任何其他代码的情况相同。我错过了什么吗?

我的系统:

sch@sch-K52F:~/test$ uname -a
Linux sch-K52F 3.2.0-45-generic-pae #70-Ubuntu SMP Wed May 29 20:31:05 UTC 2013 i686 i686 i386 GNU/Linux
sch@sch-K52F:~/test$ gprof -v
GNU gprof (GNU Binutils for Ubuntu) 2.22
Based on BSD gprof, copyright 1983 Regents of the University of California.
This program is free software.  This program has absolutely no warranty.

谢谢


编辑 1)

其他例子:

 time   seconds   seconds    calls  Ts/call  Ts/call  name
  0.00      0.00     0.00     1482     0.00     0.00  std::_Iter_base<unsigned char*, false>::_S_base(unsigned char*)
  0.00      0.00     0.00     1482     0.00     0.00  std::_Niter_base<unsigned char*>::iterator_type std::__niter_base<unsigned char*>(unsigned char*)
  0.00      0.00     0.00     1247     0.00     0.00  std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_M_get_Tp_allocator()
  0.00      0.00     0.00      988     0.00     0.00  __gnu_cxx::__normal_iterator<unsigned char*, std::vector<unsigned char, std::allocator<unsigned char> > >::base() const
  0.00      0.00     0.00      988     0.00     0.00  std::move_iterator<unsigned char*>::base() const
  0.00      0.00     0.00      988     0.00     0.00  std::vector<unsigned char, std::allocator<unsigned char> >::size() const
  0.00      0.00     0.00      988     0.00     0.00  std::_Iter_base<std::move_iterator<unsigned char*>, true>::_S_base(std::move_iterator<unsigned char*>)
  0.00      0.00     0.00      988     0.00     0.00  std::move_iterator<unsigned char*>::move_iterator(unsigned char*)
  0.00      0.00     0.00      988     0.00     0.00  std::_Miter_base<std::move_iterator<unsigned char*> >::iterator_type std::__miter_base<std::move_iterator<unsigned char*> >(std::move_iterator<unsigned char*>)
  0.00      0.00     0.00      988     0.00     0.00  std::move_iterator<unsigned char*> std::make_move_iterator<unsigned char*>(unsigned char* const&)
  0.00      0.00     0.00      741     0.00     0.00  __gnu_cxx::new_allocator<unsigned char>::max_size() const
  0.00      0.00     0.00      555     0.00     0.00  operator new(unsigned int, void*)
  0.00      0.00     0.00      541     0.00     0.00  void std::_Destroy_aux<true>::__destroy<unsigned char*>(unsigned char*, unsigned char*)
  0.00      0.00     0.00      541     0.00     0.00  std::_Vector_base<unsigned char, std::allocator<unsigned char> >::_M_deallocate(unsigned char*, unsigned int)
  0.00      0.00     0.00      541     0.00     0.00  void std::_Destroy<unsigned char*>(unsigned char*, unsigned char*)

对于任何代码、任何函数,我总是得到零时间;/

【问题讨论】:

  • wldsvc 有正确答案,你得到零时间的原因是因为gprof 每秒对 PC 进行 100 次采样,而你的程序实际使用的 CPU 量远小于 1/100一秒钟。但是,gprof 也计算调用次数,您可以看到这些。

标签: c++ profiler gprof


【解决方案1】:

这是因为 sleep() 不计入进程执行时间的一部分,而是计入睡眠。即您的进程在请求的持续时间内被内核置于睡眠状态,并且不使用任何 CPU 周期。尝试使用一些进行实际计算的循环。此外,gprof 似乎无法对系统调用和其他事情进行计时。它也有other issues。 Gprof 旨在比较您自己代码的连续重构中的性能增益,而不是作为通用基准测试工具。

【讨论】:

  • 看起来你正在使用 STL,它有很多内联方法。不确定 gprof 是否也能正确处理这个问题。作为在某些情况下有效的示例,只需在示例程序中编写一个 1 到 1,000,000,000 的虚拟循环。您会看到一些时间信息。
猜你喜欢
  • 2016-01-04
  • 1970-01-01
  • 1970-01-01
  • 2016-11-21
  • 2014-05-07
  • 2021-02-15
  • 1970-01-01
  • 2023-01-05
  • 2012-06-29
相关资源
最近更新 更多