我在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;}
}
}
答案 0 :(得分:1)
如果您的总体目标是查找和消除性能问题,则可以consider this.
我怀疑它会显示基本上100%的CPU时间用于查找和字符串比较,几乎为您的代码留下0%。这就是仅对程序计数器进行采样时会发生的情况。
如果您对调用堆栈进行采样,您将看到调用find和string-compare的代码行将显示在堆栈上,其频率等于它们负责的时间。
这是gprof的荣耀。
P.S。您也可以通过在反汇编级别单步执行代码来解决这个问题。
答案 1 :(得分:1)
我经常遇到这个问题。 ESP。在严格的线程代码中。
您可以将valgrind与--callgrind选项(工具)一起使用,这样您至少可以更详细地查看每个函数调用的时间。还有一个kde工具可视化输出(和eswp。调用图),更好地称为kcachegrind。不知道你是否可以在cygwin上安装它。
答案 2 :(得分:0)
您使用的是什么版本的gprof?一些旧版本有这个确切的错误。
运行gprof --version并告诉我们结果。