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编辑  收藏  举报

导航