无法使用 gprof(gnu 分析器)累积时间
我在 Windows 上运行 cygwin 并使用最新版本的 gprof 来分析我的代码。我的问题是,平面配置文件显示我的代码中的每个函数都为零秒,我什至尝试循环这些函数(尝试了一百万个 for 循环),但 gprof 无法累积任何时间。请帮忙。这是我的示例函数之一。
bool is_adjacent(const char* a ,const char* b)
{
for(long long iter=0;iter<=1000000;iter++){
string line1="qwertyuiop";
string line2="asdfghjkl";
string line3="zxcvbnm";
string line4="1234567890";
int pos=line1.find(*a);
if(pos!=string::npos){
if ((line1[pos++]==*b)||((pos!=0)&&(line1[pos--]==*b)))
return true;
else return false;}
pos=line2.find(*a);
if(pos!=string::npos){
if ((line2[pos++]==*b)||((pos!=0)&&(line2[pos--]==*b)))
return true;
else return false;}
pos=line3.find(*a);
if(pos!=string::npos){
if ((line3[pos++]==*b)||((pos!=0)&&(line3[pos--]==*b)))
return true;
else return false;}
pos=line4.find(*a);
if(pos!=string::npos){
if ((line4[pos++]==*b)||((pos!=0)&&(line4[pos--]==*b)))
return true;
else return false;}
}
}
I am running cygwin on windows and using latest version of gprof for profiling my code. My problem is that the flat profile shows zero sec for each of the functions in my code, I even tried to loop the functions(tried a for loop for a million) but gprof is unable to accumulate any time .Please help . Here is one of my sample function.
bool is_adjacent(const char* a ,const char* b)
{
for(long long iter=0;iter<=1000000;iter++){
string line1="qwertyuiop";
string line2="asdfghjkl";
string line3="zxcvbnm";
string line4="1234567890";
int pos=line1.find(*a);
if(pos!=string::npos){
if ((line1[pos++]==*b)||((pos!=0)&&(line1[pos--]==*b)))
return true;
else return false;}
pos=line2.find(*a);
if(pos!=string::npos){
if ((line2[pos++]==*b)||((pos!=0)&&(line2[pos--]==*b)))
return true;
else return false;}
pos=line3.find(*a);
if(pos!=string::npos){
if ((line3[pos++]==*b)||((pos!=0)&&(line3[pos--]==*b)))
return true;
else return false;}
pos=line4.find(*a);
if(pos!=string::npos){
if ((line4[pos++]==*b)||((pos!=0)&&(line4[pos--]==*b)))
return true;
else return false;}
}
}
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(3)
我时不时就会遇到这个问题。特别是。在多线程代码中。
您可以将 valgrind 与 --callgrind 选项(工具)一起使用,这将允许您至少更详细地了解每个函数调用的时间。还有一个 kde 工具可以可视化输出(和 eswp.callgraph),更好地称为 kcachegrind。不知道是否可以在 cygwin 上安装它。
I'm having that problem from time to time. Esp. in heavily threaded code.
You can use valgrind with the --callgrind option (tool) which will allow you to at least have a more detailed view of how much time per function call. There's a kde tool as well to visualize the output (and eswp. callgraph) better called kcachegrind. Don't know if you can install that on cygwin though.
如果您的总体目标是查找并消除性能问题,您可能考虑一下这一点。
我怀疑它会显示基本上 100% 的 CPU 时间都花在查找和字符串比较上,为代码留下几乎 0% 的时间。这就是仅对程序计数器进行采样时发生的情况。
如果对调用堆栈进行采样,您将看到调用 find 和 string-compare 的代码行将以等于它们负责的时间的频率显示在堆栈上。
这就是 gprof 的荣耀。
PS 您还可以通过在反汇编级别单步执行代码来解决这个问题。
If your overall goal is to find and remove performance problems, you might consider this.
I suspect it will show that essentially 100% of the CPU time is being spent in find and string-compare, leaving almost 0% for your code. That's what happens when only the program counter is sampled.
If you sample the call stack, you will see that the lines of code that invoke find and string-compare will be displayed on the stack with a frequency equal to the time they are responsible for.
That's the glory of gprof.
P.S. You could also figure this out by single-stepping the code at the disassembly level.
您使用什么版本的 gprof?一些旧版本有这个确切的错误。
运行 gprof --version 并告诉我们结果。
What version of gprof are you using? Some old versions have this exact bug.
Run gprof --version and tell us the results.