simpleperf-1
1. simpleperf 源码路径:
source/vnd/system/extras/simpleperf
2. 使用方法
测试代码:
static void busy_loop_delay_ms(unsigned long num) { unsigned long ts, delta_t; ts = local_clock(); mdelay(num); delta_t = sched_clock() - ts; pr_info("busy delay time=%ld.%ld ms\n", delta_t/1000000, (delta_t/1000)%1000); } static ssize_t proc_pi_test_read(struct file *file, char __user *buf, size_t count, loff_t *ppos) { char buffer[16]; size_t len; busy_loop_delay_ms(1000); len = snprintf(buffer, sizeof(buffer), "%s\n", g_pi_test_str); return simple_read_from_buffer(buf, count, ppos, buffer, len); }
执行下面测试:
/sdcard # simpleperf record cat /proc/pi_test
simpleperf I cmd_record.cpp:760] Samples recorded: 7612. Samples lost: 0.
/sdcard #
/sdcard # simpleperf report
Cmdline: /system/bin/simpleperf record cat /proc/pi_test
Arch: arm64
Event: cpu-cycles (type 0, config 0)
Samples: 7612
Event count: 3664296930
Overhead Command Pid Tid Shared Object Symbol
50.17% cat 6576 6576 [kernel.kallsyms] arch_counter_get_cntvct$bcb11a1e6d2eb4313d99baca138ae8af
48.29% cat 6576 6576 [kernel.kallsyms] __delay //这个函数耗时较多
0.38% cat 6576 6576 unknown unknown[+ffffffc0100948c4]
0.30% cat 6576 6576 [kernel.kallsyms] __softirqentry_text_start
0.15% cat 6576 6576 [kernel.kallsyms] _raw_spin_unlock_irqrestore
0.11% cat 6576 6576 [kernel.kallsyms] kmem_cache_alloc
0.11% cat 6576 6576 [kernel.kallsyms] _raw_spin_unlock_irq
0.06% cat 6576 6576 [kernel.kallsyms] kmem_cache_alloc_trace
0.03% cat 6576 6576 [kernel.kallsyms] handle_mm_fault
0.03% cat 6576 6576 [kernel.kallsyms] perf_output_copy
0.02% cat 6576 6576 [kernel.kallsyms] __rcu_read_lock
0.02% cat 6576 6576 [kernel.kallsyms] avtab_search_node
0.02% cat 6576 6576 [kernel.kallsyms] kernel_poison_pages
0.02% cat 6576 6576 [kernel.kallsyms] mem_cgroup_commit_charge
0.02% cat 6576 6576 [kernel.kallsyms] free_unref_page_list
0.02% cat 6576 6576 /apex/com.android.runtime/bin/linker64 [linker]std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> >::basic_string(std::__1::basic_string<char, std::__1::char_traits<char>, std::__1::allocator<char> > const&, unsigned long, unsigned long, std::__1::allocator<char> const&)
0.02% cat 6576 6576 [kernel.kallsyms] do_dentry_open
0.02% cat 6576 6576 [kernel.kallsyms] _raw_spin_unlock
0.02% cat 6576 6576 [kernel.kallsyms] kmem_cache_free
0.02% cat 6576 6576 [kernel.kallsyms] tracer_preempt_on
0.02% cat 6576 6576 [kernel.kallsyms] __d_lookup_rcu
0.02% cat 6576 6576 [kernel.kallsyms] vma_interval_tree_insert
0.02% cat 6576 6576 /system/lib64/libcrypto.so sha256_block_armv8
0.02% cat 6576 6576 [kernel.kallsyms] __split_vma
0.02% cat 6576 6576 /apex/com.android.runtime/bin/linker64 [linker]VersionTracker::init_verneed(soinfo const*)
0.02% cat 6576 6576 /apex/com.android.runtime/bin/linker64 [linker]bool packed_relocate_impl<(RelocMode)1>(Relocator&, sleb128_decoder)
0.02% cat 6576 6576 /apex/com.android.runtime/bin/linker64 [linker]elf64_sym const* soinfo_do_lookup_impl<false>(char const*, version_info const*, soinfo**, SymbolLookupList const&)
0.02% cat 6576 6576 [kernel.kallsyms] __do_munmap
0.02% cat 6576 6576 [kernel.kallsyms] unmap_vmas
0.01% cat 6576 6576 [kernel.kallsyms] proc_pi_test_read //这里显示出了这个函数
0.01% cat 6576 6576 [kernel.kallsyms] memset
0.01% cat 6576 6576 [kernel.kallsyms] __const_udelay
0.01% cat 6576 6576 [kernel.kallsyms] __run_timers
0.00% cat 6576 6576 [kernel.kallsyms] __vma_adjust
0.00% simpleperf 6576 6576 [kernel.kallsyms] perf_event_exec
注: 个别函数中纯运行耗时比较长,可以使用一下。
3. 使用 Android Studio 抓 simpleperf 火焰图
使用 "2022.2.1 Patch 2" 这个版本的AndroidStudio工具,新建一个工程,然后编译过后,窗口最下面有一个 Profiler 图标,打开这个窗口后点击 SESSIONS 后面的"+"号,选择自己的项目,然后从"Other debuggable processes"中选择想监控的进程。
点击窗口,选择"CPU",然后选择"Callstack Sample",点"Record"开始记录,点"Stop"停止记录,然后从弹出的采样窗口中括一段,选右侧的"Flame Chart"选项,即可展示火焰图。
点击选中火焰图窗口,按'W'/'S'进行缩放,按'A'/'D'键左右平移。
选中"SESSIONS"窗口下的"Callstack Sample Re..."右侧的"Export Callstack Sample Recording"将simpleperf文件保存起来。下次使用时点"+"号"Load From File..."加载进来即可。
posted on 2022-05-01 13:10 Hello-World3 阅读(366) 评论(0) 编辑 收藏 举报