我正在使用linuxperf分析一个C++应用程序,并且我使用GProf2dot得到了一个很好的控制流图.但是,C库(libc6-2.13.so)中的一些符号占用了总时间的很大一部分,但没有边。例如:_int_malloc占用了8%的时间,但没有调用parents。__strcmp_sse42和__cxxabiv1::__si_class_type_info::__do_dyncast一起占用了大约10%的时间,并且调用者的名字是0,它有调用者2d6935c、2cc748c和没有调用者的6。因此,我无法仅使用perf找出哪些例程负责所有这些分配和动态转换。但是,似乎其他符号(例如mal
我正在寻找一个Linux实用程序,它允许在我的程序中分析缓存驱逐。具体来说,我有兴趣找出导致某些缓存行反复从L2缓存中逐出的原因。有什么建议? 最佳答案 您有多种选择,其中一些是免费的。下面我将主要讨论分析L2未命中,不一定是L2驱逐,因为它们或多或少是相同的。线路被逐出L2,因为正在引入另一条线路,而另一条线路通常由于L2未命中而被引入。缓存研磨首先,我会尝试cachegrind.这基本上是在一种轻量级虚拟机下运行你的二进制文件,它允许它拦截所有内存访问,然后模拟它们对缓存的影响。它可以准确指出缓存未命中发生的位置、谁负责驱逐等。
我正在寻找一个Linux实用程序,它允许在我的程序中分析缓存驱逐。具体来说,我有兴趣找出导致某些缓存行反复从L2缓存中逐出的原因。有什么建议? 最佳答案 您有多种选择,其中一些是免费的。下面我将主要讨论分析L2未命中,不一定是L2驱逐,因为它们或多或少是相同的。线路被逐出L2,因为正在引入另一条线路,而另一条线路通常由于L2未命中而被引入。缓存研磨首先,我会尝试cachegrind.这基本上是在一种轻量级虚拟机下运行你的二进制文件,它允许它拦截所有内存访问,然后模拟它们对缓存的影响。它可以准确指出缓存未命中发生的位置、谁负责驱逐等。
我正在比较一些系统调用,其中我从内存读取/写入内存。C中是否定义了任何API来测量页面错误(页面输入/输出)?我找到了这个图书馆libperfstat.a但它适用于AIX,我找不到任何适用于linux的东西。编辑:我知道linux中的time和perf-stat命令,只是探索是否有任何东西可供我在C程序中使用。 最佳答案 如果您在Linux上运行,则可以使用perf_event_open系统调用(由perfstat使用)。获取正确的参数有点棘手,请查看手册页http://web.eece.maine.edu/~vweaver/pro
我正在比较一些系统调用,其中我从内存读取/写入内存。C中是否定义了任何API来测量页面错误(页面输入/输出)?我找到了这个图书馆libperfstat.a但它适用于AIX,我找不到任何适用于linux的东西。编辑:我知道linux中的time和perf-stat命令,只是探索是否有任何东西可供我在C程序中使用。 最佳答案 如果您在Linux上运行,则可以使用perf_event_open系统调用(由perfstat使用)。获取正确的参数有点棘手,请查看手册页http://web.eece.maine.edu/~vweaver/pro
我试图理解linuxperf,发现了一些非常令人困惑的行为:我写了一个简单的多线程示例,每个内核固定一个线程;每个线程在本地运行计算并且不相互通信(参见下面的test.cc)。我在想这个例子应该有非常低的上下文切换,如果不是零的话。但是,使用linuxperf分析示例显示了数千个上下文切换-比我预期的要多得多。我进一步分析了linux命令sleep20以进行比较,显示上下文切换要少得多。此个人资料结果对我来说没有任何意义。是什么导致了如此多的上下文切换?>sudoperfstat-esched:sched_switch./testPerformancecounterstatsfor'.
我试图理解linuxperf,发现了一些非常令人困惑的行为:我写了一个简单的多线程示例,每个内核固定一个线程;每个线程在本地运行计算并且不相互通信(参见下面的test.cc)。我在想这个例子应该有非常低的上下文切换,如果不是零的话。但是,使用linuxperf分析示例显示了数千个上下文切换-比我预期的要多得多。我进一步分析了linux命令sleep20以进行比较,显示上下文切换要少得多。此个人资料结果对我来说没有任何意义。是什么导致了如此多的上下文切换?>sudoperfstat-esched:sched_switch./testPerformancecounterstatsfor'.
我试图了解如何衡量性能并决定编写非常简单的程序:section.textglobal_start_start:movrax,60syscall然后我用perfstat./bin运行了程序。令我惊讶的是stalled-cycles-frontend太高了。0.038132task-clock(msec)#0.148CPUsutilized0context-switches#0.000K/sec0cpu-migrations#0.000K/sec2page-faults#0.052M/sec107,386cycles#2.816GHz81,229stalled-cycles-fronten
我试图了解如何衡量性能并决定编写非常简单的程序:section.textglobal_start_start:movrax,60syscall然后我用perfstat./bin运行了程序。令我惊讶的是stalled-cycles-frontend太高了。0.038132task-clock(msec)#0.148CPUsutilized0context-switches#0.000K/sec0cpu-migrations#0.000K/sec2page-faults#0.052M/sec107,386cycles#2.816GHz81,229stalled-cycles-fronten
虽然我可以直观地得到大部分结果,但我很难完全理解perfreport命令的输出,尤其是关于调用图的内容,所以我写了一个愚蠢的测试来一次性解决我的这个问题。愚蠢的测试我编译了以下内容:gcc-Wall-pedantic-lmperf-test.c-operf-test没有积极的优化来避免内联等。#include#defineN10000000UL#defineUSELESSNESS(n)\do{\unsignedlongi;\doublex=42;\for(i=0;i扁平化分析perfrecord./perf-testperfreport有了这些我得到:94,44%perf-testli