我正在寻找一个分析器,以便找到我的C++代码中的瓶颈.我想找一个免费,非侵入性和良好的分析工具.我是一名游戏开发人员,我使用PIX for Xbox 360并发现它非常好,但它不是免费的.我知道英特尔VTune,但它也不是免费的.
我需要找到Android应用中瓶颈的位置.
我可以使用哪些分析工具或技术?
除了ruby-prof和核心Benchmark类之外,你用什么来分析你的Ruby代码?特别是,您如何找到代码中的瓶颈?几乎感觉我需要使用我自己的小工具才能找出在我的代码中花费的所有时间.
我意识到ruby-prof提供了这个,但输出坦率地说非常混乱,并且不容易找出你自己的代码的哪些实际块是问题的根源(它告诉你哪些方法调用占用了最多的时间)虽然).因此,我并没有像我想的那样得到更多的东西,而且还没有真正能够利用它.
也许我做错了?还有替代品吗?谷歌搜索不会为我带来任何东西.
我曾经使用过系统监视器应用程序中内置的漂亮的Apple探查器.只要您的C++代码是使用调试信息编译的,您就可以对正在运行的应用程序进行采样,并打印出一个缩进的树,告诉您父函数在此函数中花费的时间百分比(以及正文与其他函数调用) .
例如,如果main调用function_1and function_2,function_2调用function_3,然后是main调用function_3:
main (100%, 1% in function body):
function_1 (9%, 9% in function body):
function_2 (90%, 85% in function body):
function_3 (100%, 100% in function body)
function_3 (1%, 1% in function body)
Run Code Online (Sandbox Code Playgroud)
我会看到这一点,然后想一想,"有些东西需要花费很长时间function_2才能完成代码.如果我希望我的程序更快,那就是我应该开始的地方."
我怎样才能最轻松地获得Python程序的精确分析输出?
我见过有人说这样做:
import cProfile, pstats
prof = cProfile.Profile()
prof = prof.runctx("real_main(argv)", globals(), locals())
stats = pstats.Stats(prof)
stats.sort_stats("time") # Or cumulative
stats.print_stats(80) # 80 = how many to print
Run Code Online (Sandbox Code Playgroud)
但与优雅的呼叫树相比,它相当混乱.如果你能轻易做到这一点,请告诉我,这会有所帮助.
我想提高Python脚本的性能,并一直cProfile用于生成性能报告:
python -m cProfile -o chrX.prof ./bgchr.py ...args...
Run Code Online (Sandbox Code Playgroud)
我chrX.prof用Python 打开了这个文件pstats并打印出统计信息:
Python 2.7 (r27:82500, Oct 5 2010, 00:24:22)
[GCC 4.1.2 20080704 (Red Hat 4.1.2-44)] on linux2
Type "help", "copyright", "credits" or "license" for more information.
>>> import pstats
>>> p = pstats.Stats('chrX.prof')
>>> p.sort_stats('name')
>>> p.print_stats()
Sun Oct 10 00:37:30 2010 chrX.prof
8760583 function calls in 13.780 CPU seconds
Ordered by: function name
ncalls tottime percall cumtime percall filename:lineno(function)
1 0.000 0.000 0.000 0.000 {_locale.setlocale} …Run Code Online (Sandbox Code Playgroud) 在SO上,有很多关于性能分析的问题,但我似乎没有找到整体情况.涉及到相当多的问题,大多数问答都会忽略所有问题,但不能忽视其中的一些问题.
我想知道什么.如果我有两个功能做同样的事情,我很好奇速度的差异,没有外部工具,定时器测试这个是否有意义,或者在测试中编译会影响结果吗?
我问这个是因为如果它是明智的,作为一个C++程序员,我想知道它应该如何做到最好,因为它们比使用外部工具简单得多.如果它有意义,让我们继续讨论所有可能的陷阱:
考虑这个例子.以下代码显示了执行相同操作的两种方法:
#include <algorithm>
#include <ctime>
#include <iostream>
typedef unsigned char byte;
inline
void
swapBytes( void* in, size_t n )
{
for( size_t lo=0, hi=n-1; hi>lo; ++lo, --hi )
in[lo] ^= in[hi]
, in[hi] ^= in[lo]
, in[lo] ^= in[hi] ;
}
int
main()
{
byte arr[9] = { 'a', 'b', 'c', 'd', 'e', 'f', 'g', 'h' };
const int iterations = 100000000;
clock_t begin = clock();
for( int i=iterations; i!=0; --i )
swapBytes( arr, 8 );
clock_t …Run Code Online (Sandbox Code Playgroud) 我在这里阅读了很多帖子,给出了剖析建议,但我需要问一下.
据我所知,Visual C++ Express不会生成探查器程序使用的调试文件.我尝试了AMD Codeanalyst,它似乎工作得很好,除了我的程序中没有任何例程被识别出来 - 只是很多"未识别的模块".
我是C++的新手.我已经习惯了Python使用的简单探查器.我认为很简单,因为语言被解释了.
我很欣赏任何见解.
PS:方向盘的旋转是汽车旋转的衍生物吗?
有没有比使用C++列表容器的比较运算符更有效地按字节比较数据的方法?
我要比较[大?10 kByte <size <500 kByte]按字节数量的数据,以验证外部存储设备的完整性.
因此,我按字节顺序读取文件并将值存储在无符号字符列表中.此列表的资源由shared_ptr处理,因此我可以在程序中传递它,而无需担心列表的大小
typedef boost::shared_ptr< list< unsigned char > > = contentPtr;
namespace boost::filesystem = fs;
contentPtr GetContent( fs::path filePath ){
contentPtr actualContent (new list< unsigned char > );
// Read the file with a stream, put read values into actual content
return actualContent;
Run Code Online (Sandbox Code Playgroud)
这样做了两次,因为文件总是有两个副本.必须比较这两个文件的内容,如果发现不匹配则抛出异常
void CompareContent() throw( NotMatchingException() ){
// this part is very fast, below 50ms
contentPtr contentA = GetContent("/fileA");
contentPtr contentB = GetContent("/fileB");
// the next part takes about 2secs with …Run Code Online (Sandbox Code Playgroud) 我试图搜索,但到目前为止没有运气.有谁知道一个好的资源应该如何进行冷启动优化?
该应用程序是C++/MFC应用程序,使用VS2010编译,完整版,内置分析器可用.我试图减少所有额外的重量,以使热启动的负载时间可以接受,但冷启动是完全不可接受的.有时接近30秒,并没有什么是慢代码明智的.热启动时CPU负载达到80%,冷启动时低于20%.
我今天尝试使用延迟加载链接器设置,但我不太明白它们如何影响性能.此外,我尝试了可执行的打包程序,但VM上的测试似乎没有那么快.还有什么我可以尝试的吗?
我有一个Ruby程序,大约需要4分钟才能完成任务,我想把它降到1分钟以下.
我尝试了宝石中的ruby-prof,但是它使运行时间增加到约30分钟,甚至看起来都没有特别好地保持单调性(一些变化可靠地提高了性能 - 使用剖析器并且可靠地降低了性能 - 没有剖析器).此任务也无法真正分解为可以独立进行有意义分析的部分.
目前以最低开销分析Ruby代码的最佳方法是什么?
我使用OSX,但如果由于任何原因,探测器需要另一个操作系统,我可能会重新启动.
编辑:perftools.rb具有更低的开销,但结果看起来相当可疑诚实,超出任何合理的抽样错误 - 至少它必须搞乱GC或i/o缓冲或类似的东西,导致很多愚蠢的错误归因.它仍然击败了ruby-prof.
我会保持问题公开,万一有人知道比这更好的事情.
profiling ×6
c++ ×5
performance ×4
profile ×2
profiler ×2
python ×2
ruby ×2
ruby-prof ×2
android ×1
comparison ×1
containers ×1
cprofile ×1
java ×1
mfc ×1
optimization ×1
stl ×1
timer ×1
tree ×1
visual-c++ ×1
windows ×1