zoukankan      html  css  js  c++  java
  • how to use perf

    Since I did't see here anything about perf which is a relatively new tool for profiling the kernel and user applications on Linux I decided to add this information.

    First of all - this is a tutorial about Linux profiling with perf

    You can use perf if your Linux Kernel is greater than 2.6.32 or oprofile if it is older. Both programs don't require from you to instrument your program (like gprof requires). However in order to get call graph correctly in perf you need to build you program with -fno-omit-frame-pointer. For example: g++ -fno-omit-frame-pointer -O2 main.cpp.

    You can see "live" analysis of your application with perf top:

    sudo perf top -p `pidof a.out` -K

    Or you can record performance data of a running application and analyze them after that:

    1) To record performance data:

    perf record -p `pidof a.out`

    or to record for 10 secs:

    perf record -p `pidof a.out` sleep 10

    or to record with call graph ()

    perf record -g -p `pidof a.out`

    2) To analyze the recorded data

    perf report --stdio

    perf report --stdio --sort=dso -g none

    perf report --stdio -g none

    perf report --stdio -g

    Or you can record performace data of a application and analyze them after that just by launching the application in this way and waiting for it to exit:

    perf record ./a.out

    This is an example of profiling a test program

    The test program is in file main.cpp (I will put main.cpp at the bottom of the message):

    I compile it in this way:

    g++ -m64 -fno-omit-frame-pointer -g main.cpp -L.  -ltcmalloc_minimal -o my_test

    I use libmalloc_minimial.so since it is compiled with -fno-omit-frame-pointer while libc malloc seems to be compiled without this option. Then I run my test program

    ./my_test 100000000

    Then I record performance data of a running process:

    perf record -g  -p `pidof my_test` -o ./my_test.perf.data sleep 30

    Then I analyze load per module:

    perf report --stdio -g none --sort comm,dso -i ./my_test.perf.data

    # Overhead  Command                 Shared Object

    # ........  .......  ............................

    #

    70.06%  my_test  my_test

    and so on ...

    Then call chains are analyzed:

    perf report --stdio -g graph -i ./my_test.perf.data | c++filt

    0.16%  my_test  [kernel.kallsyms]             [k] _spin_lock

    and so on ...

    So at this point you know where your program spends time.

    And this is main.cpp for the test:

    #include <stdio.h>

    #include <stdlib.h>

    #include <time.h>

    time_t f1(time_t time_value)

    {

    for (int j =0; j < 10; ++j) {

    ++time_value;

    if (j%5 == 0) {

    double *p = new double;

    delete p;

    }

    }

    return time_value;

    }

    time_t f2(time_t time_value)

    {

    for (int j =0; j < 40; ++j) {

    ++time_value;

    }

    time_value=f1(time_value);

    return time_value;

    }

    time_t process_request(time_t time_value)

    {

    for (int j =0; j < 10; ++j) {

    int *p = new int;

    delete p;

    for (int m =0; m < 10; ++m) {

    ++time_value;

    }

    }

    for (int i =0; i < 10; ++i) {

    time_value=f1(time_value);

    time_value=f2(time_value);

    }

    return time_value;

    }

    int main(int argc, char* argv2[])

    {

    int number_loops = argc > 1 ? atoi(argv2[1]) : 1;

    time_t time_value = time(0);

    printf("number loops %d ", number_loops);

    printf("time_value: %d ", time_value );

    for (int i =0; i < number_loops; ++i) {

    time_value = process_request(time_value);

    }

    printf("time_value: %ld ", time_value );

    return 0;

    }

    原文

    http://stackoverflow.com/questions/1777556/alternatives-to-gprof#comment3480484_1779343

  • 相关阅读:
    [原][python]把python文件编译成exe(解决安装pyinstaller出现的错误)
    [原][c++][公式]计算球弧面体积------球缺
    Java运行时动态生成类几种方式
    Flink窗口Window机制详解
    Bootstrap 提示工具(Tooltip)插件
    Bootstrap-table 使用说明--如何在表格td里增加一个按钮
    如何在列表操作列区域添加按钮及控制已有按钮显示
    fastadmin 如何去掉 权重拖拽 图标
    如何设置select下拉禁止选择
    js引用cdn,如果cdn挂了,用本地js替补
  • 原文地址:https://www.cnblogs.com/mydomain/p/3204523.html
Copyright © 2011-2022 走看看