Kej*_*ori 5 c++ performance-testing linux-kernel perf
我使用以下开关编译了我的 C++ 代码:
g++ -O0 -g -rdynamic -DNDEBUG -DARMA_NO_DEBUG -std=c++11 -pthread
Run Code Online (Sandbox Code Playgroud)
链接器开关是:
-lboost_system -lboost_thread -lboost_chrono -larmadillo -pthread
Run Code Online (Sandbox Code Playgroud)
但是我在我的应用程序中没有使用线程。我也避免使用任何delay函数。
然后我运行代码并使用perf工具对其进行测试。
sudo perf record ./bin/my_application
sudo perf report -f
Run Code Online (Sandbox Code Playgroud)
结果对我来说很奇怪:
Overhead Command Shared Object Symbol
50.92% myApplication [kernel.kallsyms] [k] native_sched_clock
24.73% myApplication [kernel.kallsyms] [k] pick_next_entity
17.46% myApplication [kernel.kallsyms] [k] prepend_name
2.57% myApplication myApplication [.] arma::arrayops::copy_small<double>
1.11% myApplication myApplication [.] arma::Mat<double>::Mat
1.11% myApplication myApplication [.] myClass::myMethod
1.11% myApplication libblas.so.3 [.] dgemv_
0.97% myApplication myApplication [.] arma::Mat<double>::init_cold
Run Code Online (Sandbox Code Playgroud)
为什么 kernel.kallsyms函数主宰了执行时间?
什么是native_sched_clock,pick_next_entity,prepend_name各做我的应用程序?
您的应用程序速度太快且太短,无法使用默认频率 进行分析perf record。所有带有[k]和[kernel.kallsyms]的行都来自内核,执行一些服务工作,例如加载二进制文件和调度线程/进程(``)。当您在某种虚拟化平台(如 xen、kvm 等)上使用 perf 时,情况可能会出现问题,因为大多数虚拟化环境无法访问来宾内核的硬件性能计数器(AWS 有时会在隔离的虚拟机上提供基本的周期子集和指令)实例);所以perf将使用软件定时器中断。
尝试在要测量的代码周围添加循环(重复 100 或 1000 次)和/或增加要处理的数据的大小。您的程序应该至少运行几秒钟。
您还可以尝试运行perf stat ./program以获取程序的计时值和基本硬件性能计数(如果支持计数器),并发布结果。
| 归档时间: |
|
| 查看次数: |
2964 次 |
| 最近记录: |