简介
https://zhuanlan.zhihu.com/p/141694060
使用方法
编写test_perf.c程序如下
#include<stdio.h>
#include<stdlib.h>
void test_perf(){
int row = 10, col = 100;
double* arr = (double*)malloc(sizeof(double) * row * col);
for(int i = 0; i < row; i++){
for(int j = 0; j < col; j++){
arr[i * col + j] = 1;
arr[i * col + j] /= 10;
}
}
}
int main(){
test_perf();
return 0;
}
CMakeList.txt文件
cmake_minimum_required(VERSION 2.8)
project(test C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -o0")
add_executable(test test_perf.c)
target_link_libraries(test m)
编译生成test可执行文件
mkdir build
cd build
cmake ..
make
使用三板斧
运行程序生成perf.data
perf record ./test
查看perf.data文件
perf report
overhead一列为占时百分比,command为执行的命令(./test) Shared Object为目标对象,**.so为调用的动态库,Symbol为函数名或函数地址。
Overhead Command Shared Object Symbol
94.95% test libc-2.17.so [.] _dl_addr ▒ 4.88% test [unknown] [k] 0xffff000010083378 ▒
0.18% test ld-2.17.so [.] _dl_start ▒
0.00% test ld-2.17.so [.] _start ▒
0.00% test [unknown] [k] 0xffff0000100814d8
只有test命令可以看到与程序相关的东西,其它的一般是看不出来什么东西的。。。
more detail
没有关于函数void test_perf()的原因是采样频率不够
增大采样频率再查看
perf record -F 100000 ./test
perf report
Overhead Command Shared Object Symbol
26.50% test libc-2.17.so [.] _dl_addr
20.68% test ld-2.17.so [.] _dl_relocate_object
11.06% test ld-2.17.so [.] _dl_lookup_symbol_x
7.09% test ld-2.17.so [.] strcmp
7.05% test test [.] test_perf
6.68% test ld-2.17.so [.] do_lookup_x
3.05% test ld-2.17.so [.] mempcpy
2.86% test ld-2.17.so [.] _dl_load_cache_lookup
2.69% test [unknown] [k] 0xffff000010095e90
2.68% test ld-2.17.so [.] strlen
2.42% test ld-2.17.so [.] _dl_check_map_versions
2.18% test ld-2.17.so [.] memset
2.04% test ld-2.17.so [.] _dl_important_hwcaps
1.32% test [unknown] [k] 0xffff000010083378
0.66% test ld-2.17.so [.] _dl_next_ld_env_entry
0.40% test ld-2.17.so [.] _dl_start
0.40% test ld-2.17.so [.] _dl_sysdep_start
0.23% test ld-2.17.so [.] _wordcopy_fwd_aligned
0.00% test ld-2.17.so [.] _start
0.00% test [unknown] [k] 0xffff0000100814d8
在Shared Object中可以找到我们的可执行程序test,在Symbol中可以找到我们的函数test_perf,也是我们程序中唯一可以优化的地方(当然也可以替换更快的动态库.so)。
也可以更详细地查看汇编代码,按上下键移动到test_perf一行,按enter,选择第一行的Annotate test_perf ,按enter。
Annotate test_perf Zoom into test thread ▒
Zoom into test DSO (use the 'k' hotkey to zoom directly into the kernel) ▒
Browse map details ▒
Run scripts for samples of symbol [test_perf] ▒
Run scripts for all samples ▒
Switch to another data file in PWD ▒Exit ▒
查看汇编
Percent│ mul w1, w1, w0 ▒
│ ldr w0, [x29,#40] ▒
│ add w0, w1, w0 ▒
│ sxtw x0, w0 ▒
│ lsl x0, x0, #3 ▒
100.00 │ ldr x1, [x29,#24] ▒
│ add x0, x1, x0 ▒
│ fmov d0, #1.000000000000000000e+01 ▒
│ fdiv d0, d1, d0 ▒
│ str d0, [x0] ▒
│ ldr w0, [x29,#40] ▒
│ add w0, w0, #0x1 ▒
│ str w0, [x29,#40] ▒
│ d0: ldr w1, [x29,#40] ▒
│ ldr w0, [x29,#32] ▒
│ cmp w1, w0 ▒
│ ↑ b.lt 40 ▒
│ ldr w0, [x29,#44]
│ add w0, w0, #0x1 ▒
│ str w0, [x29,#44] ▒
│ ec: ldr w1, [x29,#44] ▒
│ ldr w0, [x29,#36] ▒
│ cmp w1, w0 ▒
│ ↑ b.lt 38
左侧表示站当前函数(Symbol)的百分比,找到100.00,可以对应上程序中的两个for循环。
汇编看起来太麻烦,编译选项中添加-g,就可以自动对应了。
找到我们的CMakeList.txt
改成如下格式
cmake_minimum_required(VERSION 2.8)
project(test C)
set(CMAKE_C_STANDARD 99)
set(CMAKE_C_FLAGS "${CMAKE_C_FLAGS} -o0 -g")
add_executable(test test_perf.c)
target_link_libraries(test m)
编译,生成可执行文件
perf record -F 100000 ./test
perf report
找到test_perf的汇编代码
│for(int j = 0; j < col; j++){
│ ldr w0, [x29,#40]
│ add w0, w0, #0x1
│ str w0, [x29,#40]
│ ldr w1, [x29,#40]
│ ldr w0, [x29,#32]
│ cmp w1, w0
└──b.lt 40
参考
https://zhuanlan.zhihu.com/p/141694060
1516

被折叠的 条评论
为什么被折叠?



