我正在尝试使用 gprof 命令:gprof -s executable.exe gmon.out gmon.sum 来合并从我的程序的 2 次运行中收集的分析数据。但是出现以下错误:



我的程序非常简单(只有一个 for 循环)。如果我运行一次,运行时间太短(显示 0.00 秒),gprof 无法记录。

在 CygWin 中,我执行以下步骤:

  • gcc -pg -o fl forAndWhilLoop.c
  • fl (运行程序)
  • mv gmon.out gmon.sum
  • fl (运行程序)
  • gprof -s fl.exe gmon.out gmon.sum
  • gprof fl.exe gmon.sum>gmon.out
  • gprof fl.exe

  • 我的程序:
    int main(void)
    {
        int fac=1;
        int count=10;
        int k;
    
        for(k=1;k<=count;k++)
        {
            fac = fac * k;
        }
    
        return 0;
    }
    

    那么有人可以帮我解决这个问题吗?谢谢!

    最佳答案

    如果你只想计时,在我的机器上它是 105ns 。这是代码:

    void forloop(void){
        int fac=1;
        int count=10;
        int k;
    
        for(k=1;k<=count;k++)
        {
            fac = fac * k;
        }
    }
    
    int main(int argc, char* argv[])
    {
        int i;
        for (i = 0; i < 1000000000; i++){
            forloop();
        }
        return 0;
    }
    

    明白了吗?我用的是手持秒表。由于它运行了 10^9 次,秒 = 纳秒。

    像这样展开内部循环将时间减少到 92ns
    int k = 1;
    while(k+5 <= count){
        fac *= k * (k+1) * (k+2) * (k+3) * (k+4);
        k += 5;
    }
    while(k <= count){
        fac *= k++;
    }
    

    从 Debug 切换到 Release 构建将其降低到 21ns 。您只能期望在实际热点中实现这种加速,这就是。

    关于gprof - 内存不足错误。正在分配...,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/2175919/

    10-15 10:26