Articles of 分析

C ++vector数组运算符的高计算成本?

我一直知道C ++的丰富抽象带有一定的计算开销,但是我一直认为,一旦正确的编译器优化被应用,这个开销就会微乎其微。 我很好奇这个开销的大小,所以我写了一个简单的testing来确定这个。 该testing是一个模板化函数,它接受一个容器variables,为容器中的每个元素赋值,然后在一个单独的循环中跨容器求和值。 该过程重复预设的循环次数。 我发现,令我非常不安的是,vector实现花费了标准数组实现的近3倍。 在通过大量的编译器优化select而没有任何成功的情况下,我决定硬着头皮直接看看汇编代码,试着看看造成时间损失的原因。 我包含了一些汇编指令,这些指令使我能够准确地确定数组索引操作发生的位置,并详细检查了代码。 我发现,在我的完全混淆中,vector实现和数组实现之间的差异是微不足道的。 汇编代码可以在这里find。 这是我用来构build二进制文件的命令: g++ -O3 vectorArrayOp.cpp -o vectorArrayOp 这是我用来构build程序集的命令: g++ -O3 -DTAGASM vectorArrayOp.cpp -S -o vectorArrayOp.s 这是我从运行二进制文件中看到的输出: gmurphy@interloper:Reference$ ./vectorArrayOp Duration 0.027678 Duration 0.090212 当您在stdoutstream中包含计算值时,结果将保持不变,为清晰起见,我将其删除。 我的系统规格如下(我也见过我的AMD相同的结果): Linux 3.2.0-32-generic x86_64 GNU/Linux Intel(R) Xeon(R) CPU X5550 @ 2.67GH g++ (Ubuntu/Linaro 4.6.3-1ubuntu5) 4.6.3 代码如下,如果有人能够提供一些见解,说明为什么当程序集如此相似时,时序是如此不同,我将不胜感激。 #include <vector> #include <iostream> #include <sys/time.h> #ifdef […]

使用C ++在Linux中计算磁盘读/写

我的要求是通过总磁盘读/写操作(或读/写数据量)来分析当前进程磁盘读/写操作。 我需要先抽取样品,并在这两者之间绘制图表。 我需要在c ++中的Linux(Ubuntu 12.10)上执行此操作。 有任何可用于此任务的API /工具吗? 我发现一个工具,即iotop但我不知道如何使用这个当前进程与系统的广泛使用。 谢谢

是否有可能在某个二进制文件中使用vtune而不是整个二进制文件?

我正在将一个小型库的使用添加到一个现有的大型软件中,并且想要分析(在查找程序中的细节,而不仅仅是在rdtsc()或gettimeofday调用中)的开销和小型库的归属。 使用诸如rdtsc()之类的东西我可以感觉到调用我的库函数的延迟,但是我不能做延迟归因,除非我也能够看到分支是否被预测得不好,caching工作不正常等。我考虑PAPI是因为我想像在一个更大的二进制文件中查看某些硬件事件进入和退出我的库的例程,但似乎我需要一个特定的内核模块来为我工作(Linux 2.6。 18 && Intel Xeon 5570)… Vtune专门针对英特尔处理器,但它好像是用来分析性能的整个二进制文件,而不是特定的代码片段(3-4个调用到我的库中)。 有没有办法让我使用Vtune来实现我的目标,或者可能让我能够访问这样的计数器,而无需修补我的内核?

我怎样才能衡量在Linux的真正的CPU使用情况?

我知道有一些像top和ps这样的测量CPU使用率的工具,但是他们测量CPU使用率的方式是测量空闲任务没有运行的时间。 因此,例如,即使CPU因高速caching未命中而失速,这些工具仍会考虑占用CPU。 不过,我想要的是,分析工具在失速期间将CPU视为空闲。 有没有什么工具可以做到这一点?

如何衡量Linux上单个分支的预测失误?

我知道在执行一个perf stat程序时,我可以得到分支错误预测的总百分比。 但是,我怎么能得到一个特定的分支统计( if或C语言switch语句)?

分析(可能是I / O绑定)进程以减less延迟

我想在一个更大的应用程序中改进特定方法的性能。 目标是提高延迟(在特定function中花费的挂钟时间),而不是(必须)系统负载。 要求: 正如我所预料的那样,由于I / O造成了很多延迟,所以要考虑等待/阻塞所花费的时间(换句话说,看看挂钟时间而不是CPU时间) 由于该程序比我想优化的片段要多得多。 需要有一种方法来以编程方式启动/停止分析,或筛选输出以仅显示进入和退出我正在优化的function之间的时间。 对方法级别进行分析是可以接受的(如果可以在指令级别上完成的话,甚至更好,如果只是对系统调用进行configuration,那可能是不够的) 这是一个爱好项目,所以昂贵的工具不是一个真正的select 仪表(-finstrument-functions)是可以接受的 我感兴趣的关键代码很难手工中断(因为它已经相对较快,很难实际地在一个循环中调用),所以需要某种自动化。 目前丢弃的工具: gprof,oprofile,callgrind(要求1) 使用getrusage构build自定义的东西(需求1) poormansprofiler.org(要求2) strace -T,dtrace, http://perf.wiki.kernel.org (要求2和3) VTune,缩放(要求4) 手动调用堆栈抽样(要求6) 谷歌perftools(应该能够测量墙的时间,但这似乎并没有在我的情况下工作,大概是因为SIGALRM的干扰。 systemtap(我的内核不打补丁包括utrace) 其他选项,我还没有进一步评估: cprof(这里不是开箱即用的,似乎只有i386) 手动插入跟踪点(例如用lttng) 我很想听听: 其他选项 也许我过早放弃了一些工具? 我还没有评估的选项是否有工作的机会,如果是的话,如何做到最好。 我终于解决了: build立自定义使用函数 – 函数我自己,基于http://balau82.wordpress.com/2010/10/06/trace-and-profile-function-calls-with-gcc/ 这个粗糙的工具产生的痕迹很难解释,我可以很容易地想象一些工具来进一步处理它的输出,使它更有用。 不过,现在这个工作已经完成了,所以我把这个项目放到了后面)。

在Linux程序中跟踪积极使用的内存

我想跟踪各种程序在特定状态下触摸多less内存。 比如说我有一个graphics程序。 当它最小化时,可能会占用更less的内存,因为它不会重新绘制窗口,这需要读取图像和字体,并执行大量的库函数。 这些对象在内存中仍然可以访问,但实际上并没有被使用。 像top这样的工具的使用是有限的,因为他们只是告诉有多less内存映射到一个程序的地址空间,多less是驻留在物理RAM中。 同样,泄漏检测器只会告诉何时内存不可访问,而不是如果它没有被使用。 有没有一种现有的工具可以跟踪积极使用/未使用的内存这种方式? 如果可能的话,我想跟踪使用不仅在堆上,而且在stored procedures/库代码的内存。 编辑:我想澄清:我想知道一个程序实际上读取,写入或执行一定的点后,即一旦它达到一定的状态很多的内存。 尽pipe地址空间中的页面数量和驻留页面的数量是重要的度量,但这并不是我正在寻找的。 我现在正在追求三种方法: 我写了一个库,它清除了使用`mprotect`从/ proc / self / maps读取的所有内存区域(除了堆栈和自己的代码)的保护位。 它有一个段故障处理程序,恢复保护位并增加一个计数器。 我用`LD_PRELOAD`加载它,并在接收到信号时开始跟踪内存访问。 这产生了一些看似虚假地址的真正故障(在故障发生时它们不存储在任何寄存器或附近的存储器中)。 我写了一个`purge`程序,它使用`mmap`分配和读取内存,直到`mmap`返回一个错误。 这有希望强制执行目标进程中的所有页面,这些页面在“purge”运行时暂停。 然后,我使用`pidstat`来计算目标进程恢复时的页面插入次数。 这似乎工作,但它是一个非常钝的工具。 它没有给出任何关于哪些页面被触摸的信息。 我已经被告知valgrind允许你编写插件,这些插件会导致某些事件被执行,比如内存访问。 这看起来很有希望。

Gprof:特定的function时间

我想了解一下我的程序中某个特定function所花费的时间。 为了这个目的,我正在使用gprof。 我使用下面的命令获取特定function的时间,但是日志文件仍显示程序中所有function的结果。 请在这方面帮助我。 gprof -F FunctionName Executable gmon.out>log

clock_gettime()足够亚微秒时间吗?

在我们的应用程序的Linux版本中,我需要一个embedded式分析器的高分辨率定时器。 我们的分析器测量范围与个别function一样小,所以它需要一个精度高于25纳秒的定时器。 以前我们的实现使用内联汇编和rdtsc操作直接从CPU查询高频定时器,但是这是有问题的 ,需要频繁的重新校准。 所以我尝试使用clock_gettime函数来查询CLOCK_PROCESS_CPUTIME_ID。 文档声称这给了我纳秒的时间,但我发现clock_gettime()的单个调用的开销超过250ns。 这使得无法将事件的时间长度设置为100ns,并且定时器function如此高的开销严重拖慢了应用程序的性能,扭曲了configuration文件的价值。 (我们每秒有成千上万的性能分析节点。) 有没有办法调用clock_gettime()开销小于¼μs? 还是有一些其他的方式,我可以可靠地获得时间戳计数器<25ns的开销? 或者我坚持使用rdtsc ? 下面是我用来clock_gettime()的代码。 // calls gettimeofday() to return wall-clock time in seconds: extern double Get_FloatTime(); enum { TESTRUNS = 1024*1024*4 }; // time the high-frequency timer against the wall clock { double fa = Get_FloatTime(); timespec spec; clock_getres( CLOCK_PROCESS_CPUTIME_ID, &spec ); printf("CLOCK_PROCESS_CPUTIME_ID resolution: %ld sec […]

如何使用linux`perf`工具来生成“Off-CPU”configuration文件

Brendan D. Gregg(DTrace书籍的作者)有一个有趣的分析变体: “离线CPU”分析 (和离CPU火焰图 ; 幻灯片2013,P112-137 ),看看线程或应用程序被阻塞不是由CPU执行的,而是等待I / O,页面error handling程序或由于CPU资源不足而被取消预定): 这一次揭示了哪些代码path被阻塞,并在closuresCPU时等待,以及确切的时间。 这与传统的概要分析不同,后者通常以给定的时间间隔对线程的活动进行采样,并且(通常)只在线程正在CPU上执行时检查线程。 他还可以将“非CPU”configuration文件数据和“On-CPU”configuration文件组合在一起: http : //www.brendangregg.com/FlameGraphs/hotcoldflamegraphs.html Gregg给出的例子是使用dtrace ,这在Linux操作系统中通常是不可用的。 但是也有一些类似的工具(ktap,systemtap,perf),而且我认为perf具有最广泛的安装基础。 通常通过执行生成的CPU上的configuration文件(这些function在CPU上更频繁地执行)。 如何将Gregg的Off-CPU示例转换为Linux中的perf分析工具? PS:在LISA13,p124的幻灯片中,有一个关于off-CPU火焰图的systemtap变体的链接:“ Yichun Zhang创build了这些,并且一直在Linux上使用SystemTap来收集configuration文件数据,参见:• http:// agentzh .org / misc / slides / off-cpu-flame-graphs.pdf “ ”(CloudFlare Beer Meeting于2013年8月23日)