Articles of 分析

C代码的性能

我为我的C程序使用gcc。 如何检查哪种方法更快(假设我编写交换两个数字的代码,并使用位运算符重写相同的代码),在linux中是否有任何工具来检查时间,性能和空间?

内核中线程特定的单调时钟源

是否有一个单调的时钟源供内核模块使用,可以附加到一个线程,并且只会在关联线程运行时增加? 我正在寻找能够像perf API一样工作的东西,除了测量到目前为止所消耗的CPU时间总量(以纳秒为单位),而不是测量周期或指令。 在用户空间中,您有来自librt的clock_gettime函数,您可以在其中指定CLOCK_PROCESS_CPUTIME_ID作为获取上述行为的时钟types。 查看clock_gettime的源代码 ,该函数调用pthread库中另一个名为__pthread_clock_gettime函数。 我正在寻找类似的东西,可以从内核模块在Linux内核中进行设置,并将其附加到一个任务上,给出一个指向与该任务关联的task_struct的指针。

分析和分析multithreading应用程序

我们有一个multithreading的应用程序,在多个stream水线阶段都有大量的数据包处理。 该应用程序是在Linux下的C语言。 整个应用程序工作正常,没有内存泄漏或线程安全问题。 但是,为了分析应用程序,我们如何分析和分析这些线程呢? 特别是我们感兴趣的是: 每个线程完成的资源使用情况 频率和线程竞争获取locking的时机 由于同步而导致的开销量 系统中的任何瓶颈 什么是我们可以得到的最好的系统吞吐量 什么是最好的技术和工具可用于相同的?

Systemtap对性能的影响

我正在寻找一些关于systemtap对性能影响的真实信息。 我知道静态内核探测logging在他们网站的某个地方(有统计信息),但是用户空间探测呢? 我在他们的邮件列表( http://sourceware.org/ml/systemtap/2009-q1/msg00518.html )上看到了这个post,指出了在某些情况下单步执行的可能性。 任何人都可以解释/指出一些资源列出哪些技术用于哪些探测器? process().function()引入了哪些开销? 什么静态标记?

Oprofile vs perf

我正在寻找针对Linux的全系统采样分析器。 perf和OPrfile在相同的硬件计数器上工作,所以我不确定两者之间有什么区别。 那么perf和OProfile之间的区别是什么?你什么时候使用这个或那个?

为什么C ++和strace不同意open()系统调用正在进行多长时间?

我有一个打开大量文件的程序。 我计时执行一个C ++循环,它实际上只是打开和closures使用C ++定时器和strace的文件。 奇怪的是,系统时间和C ++logging的时间(相互一致)比系统调用声明花费的时间要大得多。 怎么会这样? 我已经把源和输出下面。 这一切都是因为我发现我的应用程序花费了不合理的时间来打开文件。 为了帮助我把这个问题写下来,我写了下面的testing代码(用于引用文件“files.csv”只是每行有一个文件path的列表): #include <stdio.h> #include… using namespace std; int main(){ timespec start, end; ifstream fin("files.csv"); string line; vector<string> files; while(fin >> line){ files.push_back(line); } fin.close(); clock_gettime(CLOCK_MONOTONIC, &start); for(int i=0; i<500; i++){ size_t filedesc = open(files[i].c_str(), O_RDONLY); if(filedesc < 0) printf("error in open"); if(close(filedesc)<0) printf("error in close"); } […]

perf-stat结果是否可以从perf.data文件生成?

当我想从Linux工具套件perf使用perf-stat和perf-report生成性能报告时,我运行: $ perf record -o my.perf.data myCmd $ perf report -i my.perf.data 和: $ perf stat myCmd 但这意味着我再次运行“myCmd”,这需要几分钟的时间。 相反,我希望: $ perf stat -i my.perf.data 但是与perf套件中的大多数工具不同,我没有看到perf-stat的-i选项。 有没有另外一个工具,或者一个方法来获得perf-report生成类似的输出到perf-stat?

在Linux上收集有关线程调度的信息

我想收集有关我的线程计划(和预定)以及Linux上哪些CPU的信息。 我很高兴收集信息并将其存储在一个文件中,以便以后离线分析,因为我需要将调度信息与我的代码生成的其他事件源合并。 理想情况下,信息将由程序本身收集,因为我打算大部分时间使用机器上的所有内核,并且使用外部进程进行采样会干扰我想测量的执行。 那么这在Linux上是可能的吗? 有什么select?

gperftools cpu profiler不支持多进程?

根据文档http://gperftools.googlecode.com/svn/trunk/doc/cpuprofile.html,cpuconfiguration文件确实支持多进程,并将生成独立的输出文件: 如果你的程序分叉了,子程序也将被分析(因为它们inheritance了相同的CPUPROFILE设置)。 每个进程分别进行分析; 为了区分父configuration文件和子configuration文件,所有的孩子都将自己的进程ID添加到CPUPROFILE名称中。 但是当我尝试如下: // main_cmd_argv.cpp #include <stdio.h> #include <stdlib.h> #include <unistd.h> #include <string.h> #include <sys/types.h> #include <sys/wait.h> #include <gperftools/profiler.h> int loop(int n) { int sum = 0; for (int i = 0; i < n; i++) { for (int j = 0; j < n; j++) { sum = i + j; if […]

如何在debian系统上debugging(慢速)链接器

在我的公司,我们有一个非常恼人的问题,我们的链接(ld 2.17)。 它在一个相对较快的系统(Core Duo,2GB Ram)上链接非常慢,我现在不知道如何解决这个问题。 编译一个相对较大的项目需要花费大约五到十分钟的时间(在Gentoo系统上连接大约需要5秒钟的时间)。 我个人认为这是一个巨大的生产力杀手,至less对我而言。 我们试图使用更新的版本的LD(2.19),但没有任何成功。 我在#freenode上#debian问过,但是这个问题似乎是非常独特的。 我没有find关于networking上的类似问题的任何信息。 它只发生在我们用debugging符号构build时。 我把gccdebugging信息标志改成了-g,-g3和-ggdb,但是也没有帮助。 所以我的问题是,你如何分析和debugging一个链接器? 我从来没有做过这样的事情,我也找不到任何文件。 基本上任何合理的gmon.out会很有帮助,因为我可以问binutils开发者一个具体的问题。 我完全没有意识到这一点。 编辑:我们“固定”我们的问题切换到大多数系统上的debian lenny。 感谢您的答案!