相关疑难解决方法(0)

如何使用callgrind只分析一段时间的程序执行?

我想使用valgrind进行一些分析,因为它不需要重新构建程序.(我要配置的程序已经使用"-g"构建)

但是valgrind(callgrind)很慢......所以这就是我要做的事情:

  1. 启动服务器(我想配置该服务器)
  2. 一种附加到该服务器
  3. 在服务器上执行某些操作之前,请先开始收集配置文件数据
  4. 操作完成后,结束收集配置文件数据
  5. 分析分析数据.

我可以在Solaris上使用sun studio来做这种事情.(使用dbx).我只想知道是否可以使用valgrind(callgrind)做同样的事情?

谢谢

profiling valgrind callgrind

20
推荐指数
3
解决办法
1万
查看次数

Makefile分析

所以我有这个基于Makefile的构建系统,我的用户觉得它运行得太慢了.为了这个问题,我们将性能定义为确定实际应该做什么所花费的时间.

我可以看到一些优化途径 -

  • 减少Makefile被解析的次数,并且由于包含Makefile片段而重新计算DAG.
  • 减少使用的外部Makefile的数量 make -C
  • 减少变量扩展
  • 等等

- 但我想先知道我的瓶颈在哪里.由于没有分析的优化是浪费生命,我想问:如何分析Makefile?

假设我继承的系统设计得相当好,即它已经实现了最常见的交易技巧:(主要是)非递归make,ccache,预编译头,自动生成的头依赖等).

......而且只是为了抢占一些可能的答案.我知道可能会有更快更好的构建系统然后GNU制作 - (就个人而言,我迫不及待地想看看CMake的人会对Ninja系统提出什么) - 但遗憾的是,交换构建系统并不在卡片中.

optimization profiling makefile gnu-make

19
推荐指数
1
解决办法
7234
查看次数

没有"-std = c99"的大规模fprintf速度差异

我写过一本表现不佳的翻译,几周来一直在苦苦挣扎.在下面简单的bechmark

#include<stdio.h>

int main()
{
    int x;
    char buf[2048];
    FILE *test = fopen("test.out", "wb");
    setvbuf(test, buf, _IOFBF, sizeof buf);
    for(x=0;x<1024*1024; x++)
        fprintf(test, "%04d", x);
    fclose(test);
    return 0
}
Run Code Online (Sandbox Code Playgroud)

我们看到以下结果

bash-3.1$ gcc -O2 -static test.c -o test
bash-3.1$ time ./test

real    0m0.334s
user    0m0.015s
sys     0m0.016s
Run Code Online (Sandbox Code Playgroud)

正如您所看到的,在添加"-std = c99"标志的那一刻,性能崩溃了:

bash-3.1$ gcc -O2 -static -std=c99 test.c -o test
bash-3.1$ time ./test

real    0m2.477s
user    0m0.015s
sys     0m0.000s
Run Code Online (Sandbox Code Playgroud)

我正在使用的编译器是gcc 4.6.2 mingw32.

生成的文件大约是12M,所以这两者之间的差异大约为21MB/s.

运行diff显示生成的文件是相同的.

我认为这与文件锁定有关fprintf,程序大量使用,但我无法找到在C99版本中关闭它的方法.

我尝试flockfile了在程序开始时使用的流,并funlockfile在最后使用了相应的流,但是遇到了关于隐式声明的编译器错误,以及声称对这些函数的未定义引用的链接器错误. …

c performance locking stdio mingw32

19
推荐指数
2
解决办法
1116
查看次数

如何在C++代码中找到性能瓶颈

我有一个用C++编写的服务器应用程序,并部署在Cent OS中.我没有编写其代码的任何部分,但我需要优化其性能.它的当前性能对于少量用户来说是可以接受的,但是当用户数量增加时,服务器的性能会急剧下降.

是否有任何工具,技术或最佳实践来找出瓶颈?

c++ optimization performance

18
推荐指数
1
解决办法
1万
查看次数

在积极内联的情况下分析C++?

我试图找出我的C++程序花费时间的地方,使用gprof.这是我的困境:如果我使用我用于发布版本的相同优化设置进行编译,几乎所有内容都被内联,并且gprof告诉我,无益的是,我90%的时间花在核心例程中,其中所有内容都是内联的.另一方面,如果我使用内联禁用编译,程序运行速度会慢一个数量级.

我想知道当我的程序编译时启用内联时,从我的核心例程调用的程序花了多少时间.

我在四核Intel机器上运行64位Ubuntu 9.04.我查看了google-perftools,但这似乎不适用于x86_64.在32位计算机上运行不是一种选择.

当启用内联时,是否有人建议如何更有效地配置我的应用程序?

编辑:这是我的问题的一些澄清.如果最初不清楚,我道歉.

我想找到在我的应用程序中花费的时间.分析我的优化构建导致gprof告诉我,大约90%的时间花在main上,其中所有内容都是内联的.在剖析之前我已经知道了!

我想知道的是内联函数花了多少时间,最好不要在我的构建选项中禁用优化或内联.在使用内联禁用进行性能分析时,应用程序的速度会慢一个数量级.这种执行时间的差异是一个方便的问题,但是,我不确定使用内联禁用构建的程序的性能配置文件是否与使用内联启用的程序的性能配置文件强烈对应.

简而言之:有没有办法在不禁用优化或内联的情况下获得有关C++程序的有用的性能分析信息?

c++ profiling

18
推荐指数
2
解决办法
1463
查看次数

分析多态的成本?

我有一个"不必要"多态的代码库,因为几乎每个函数都以某种方式是多态的(为什么不是,什么时候可以?),但最终程序只使用少数具体类型的函数.我已经开始花费一些时间投入SPECIALIZEINLINABLEpragma试图降低所有这些多态性的性能成本,但是随着我的代码的大小,它非常受欢迎.对于每个函数,有没有办法分析在运行时花费多少时间"完成多态性所需的事情"?

(注意:我已经问过这个问题而不知道这样的事情是否在技术上是可行的,或者"多态性需要的东西"是否足够明确).

polymorphism profiling haskell ghc

18
推荐指数
1
解决办法
559
查看次数

是否可以优化此功能?

经过剖析后,我发现这种方法占用了大部分计算时间.我真的没有看到优化的方法,因为它是一个可怕的功能.(它是......)也许有人能给我一些好主意吗?

public static double perceivedLoudness(double L_G, double L_ETQ, double a0) {
  double t1 = 1d + 1 / 4d * Math.pow(10d, 0.1d * (L_G - a0 - L_ETQ));
  double t2 = Math.pow(t1, 0.25);
  return 0.064d * Math.pow(10, 0.025 * L_ETQ) * (t2 - 1);
 }
Run Code Online (Sandbox Code Playgroud)

这是改进版本:

public static double perceivedLoudness(double L_G, double L_ETQ, double a0) {
  double x = L_G - a0 - L_ETQ;
  double t1 = 0.25 * Math.exp(0.230259 * x) + 1;
  double t2 = Math.sqrt(Math.sqrt(t1));
  return ltqFactors[(int)L_ETQ] …
Run Code Online (Sandbox Code Playgroud)

java math optimization function

17
推荐指数
1
解决办法
1045
查看次数

是否有python的统计分析器?如果没有,我怎么能写一个呢?

我需要运行一个python脚本一段随机的时间,暂停它,得到一个堆栈回溯,并取消它.我已经用Google搜索了一些方法来做到这一点,但我认为没有明显的解决方案.

python profile stochastic

17
推荐指数
2
解决办法
2398
查看次数

根据执行时间分析C++项目

在根据执行时间分析现有代码方面,我需要一些帮助.目的是加快速度.

我已经获得了一些以前工作过的代码.它完全用C++编写,带有OO概念.有一个基于GUI的界面,选择一个选项运行选定的代码.(作为项目的一部分,大约有11个班级).

我希望能够按下GUI选项并让代码运行并生成资源映射,如:

Functions of Class 1 = 20% of execution time
Functions of Class 2 = 60% of execution time
Functions of Class 3 = 10% of execution time
Functions of Class 4 = 10% of execution time
Run Code Online (Sandbox Code Playgroud)

这样,我知道哪个班级占用的时间最多,然后知道哪个班级可以继续工作并改进.但是,我不知道该怎么做.我只有基本的C++知识.

我读过这篇文章:找到c ++执行时间,但是因为程序不是串行的.一个类调用另一个,调用另一个,我不知道系统时钟/滴答是如何实现的?

我读过Valgrind,Zoom,Poor Man's Profiler等程序,但实际上并不知道如何将它与代码集成.有这么简单的方法吗?

我也读过这个方法:如何分析在Linux中运行的C++代码?但是,我不知道如何获得关于基于类的信息的尖锐信息(Class 1,Class 2等)

有人可以建议新手吗?

c++ performance

17
推荐指数
1
解决办法
1万
查看次数

使用-std = gnu ++ 11时发现了哪些已知的性能差异

我一直在研究遗传算法,我以前一直在使用g ++ 4.8.1编译参数

CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11 
Run Code Online (Sandbox Code Playgroud)

我没有使用c ++ 11的许多功能,并且有一个合理的分析系统,所以我替换了3-4行代码并让它编译而没有-std = gnu ++ 11

CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse -march=native
Run Code Online (Sandbox Code Playgroud)

当我再次运行我的探查器时,我注意到除了我的排序功能之外,我几乎可以在任何地方看到约5%的性能提升,现在排序大约是两倍.(它是一个重载的运算符<在对象上)

我的问题是:

这两个版本之间存在哪些性能差异,并且预计c ++ 11在较新的编译器中会更快?

我也期待我正在使用的事实--Ofast正在扮演一个角色,我的假设是正确的吗?

更新:

正如评论中所建议的那样,我使用with和without -march = native再次运行测试

// Fast sort, slightly slower in other tests
CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse -march=native -std=gnu++11  

// Fast sort, slower in other tests
CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse -std=gnu++11  

// Slow sort, slower in other tests
CCFLAGS=-c -Wall  -Ofast -fopenmp -mfpmath=sse                     

// Slow sort, fastest in other …
Run Code Online (Sandbox Code Playgroud)

c++ gcc profiling g++ c++11

17
推荐指数
1
解决办法
917
查看次数