zephyr/samples/subsys/profiling/perf
..
images
pytest
src
CMakeLists.txt
prj.conf
README.rst
sample.yaml

.. zephyr:code-sample:: profiling-perf
   :name: Perf tool

    Send perf samples to the host with console support

This application can be used to demonstrate :ref:`profiling-perf` work.

Requirements
************

Perf tool so far implemente only for riscv and x86_64 architectures.

Usage example
*************

Build an image with:

.. zephyr-app-commands::
    :zephyr-app: samples/subsys/profiling/perf
    :board: qemu_riscv64
    :goals: build
    :compact:

After the sample starts, enter shell command:

.. code-block:: console

  uart:~$ perf record <period> <frequency>

Wait for the completion message ``perf done!`` or ``perf buf override!``
(if perf buffer size is smaller than required).

Print made by perf samles in terminal by shell-command:

.. code-block:: console

  uart:~$ perf printbuf

Output exaple:

.. code-block:: console

    Perf buf length 2046
    0000000000000004
    00000000001056b2
    0000000000108192
    000000000010052f
    0000000000000000
      ....
    000000000010052f
    0000000000000000

Copy gotten output in some file, for example *perf_buf*.

Make graph.svg with :zephyr_file:`scripts/perf/stackcollapse.py` and
`FlameGraph`_:

.. _FlameGraph: https://github.com/brendangregg/FlameGraph/

.. code-block:: shell

  python scripts/perf/stackcollapse.py perf_buf build/zephyr/zephyr.elf | <flamegraph_dir_path>/flamegraph.pl > graph.svg

Graph example
=============

.. image:: images/graph_example.svg
    :align: center
    :alt: graph example