我需要在Windows上配置一个实时C ++应用程序。大多数可用的分析器要么非常昂贵,要么完全过度,或者两者兼而有之。我不需要任何.NET东西。由于它是一个实时应用程序,我需要尽可能快的分析器。如果它以某种方式与Visual Studio 2005/2008集成,那将是非常好的,但这不是必需的。如果这个描述提醒您使用的探查器,我真的很想知道它。我希望借助人们在Windows上使用C ++分析器来确定能够完成这项任务的人员。谢谢。
答案 0 :(得分:3)
当我必须分析实时代码时,我认为唯一的解决方案是手动滚动。您不需要太多的覆盖范围,或者最终会降低代码速度,但是如果数据集较小,则需要非常专注,实际上是手动选取每个点。
几年前我写了一个头文件,它定义了一些宏和一种捕获数据的机制,可以是函数时序,也可以是时间轴(在函数X的时间T)。代码使用QueryPerformanceCounter作为时间,并通过CreateFileMapping将数据写入指定的共享内存,以便我可以查看来自另一个进程的时序数据。
需要重新编译才能更改我想要捕获的时序信息,但代码非常便宜,几乎对代码没有任何影响。
所有代码都在头文件中,(带有宏保护,因此代码只包含一次)。所以头文件本身就是我的'profiler'。我更改了标题中的一些表,然后标记目标代码,重新编译并开始分析。
答案 1 :(得分:2)
关于性能问题的常识是测量是找到它们的先决条件 不是。 More on that subject.
This is an example of tuning an app for maximum performance.
如果您担心开销以及如何在DSP实时应用中执行此操作,请按照以下方式进行操作。使用逼真的输入运行它,然后使用暂停按钮将其停在轨道上。将调用堆栈捕获到记事本中。然后重新启动并重复几次。 (丢弃任何不相关的样本,例如等待用户输入或处于空闲状态。)请注意,此过程会在程序上放置零分析开销。
如果您的问题是您的代码在计时器上运行并且实际上只运行了一小部分时间,那么a)您可能认为您实际上没有问题,或者b)您可以仍然试着让它变得更快。如果(b)然后在你的代码周围缠绕一个循环,无论它做什么,它重复10次,100次或1000次,使得它需要足够长的时间,以便样本落在其中。使用这些示例找出要修复的内容以使其更快。完成后,移除外部循环,它将像强盗一样运行。
答案 2 :(得分:2)
Performance Validator(来自Software Verification,我工作的公司)似乎符合您的要求:
答案 3 :(得分:1)
我们进行了大量的分析,并使用了Shark(仅限OSX),vTune,Glowcode以及计数器/时钟的旧版本。
其中Shark是最好的(并且是免费的!),在某种程度上我试图将代码保持在OSX中,因此我可以使用它进行分析。不幸的是,它不符合您的要求。
vTune完全不起眼,如果不是所有分析选项,前端GUI经常崩溃或者只是简单破坏而且它的采样器没有对调用堆栈进行采样,那么获得一个不错的配置文件就太复杂了实际上看到程序中的瓶颈是如何产生的几乎没用。它也很昂贵(虽然我们最终购买了许可证)。对它有利,它是跨平台的,你可以进行30天的试用,看看你是否喜欢它。Glowcode很不错,只有IIRC的窗口,还提供免费试用。我们使用它已经有一段时间,但它可能不是一个糟糕的起点。
我们主要使用嵌入式代码的时钟,它运行单个进程,几乎没有系统开销 - 这意味着我们可以精确计算操作所需的时钟周期数。就个人而言,我不建议“滚动你自己的”分析代码(极粗比例除外)有两个原因:
答案 4 :(得分:1)
我偶尔使用名为Very Sleepy的应用程序: http://www.codersnotes.com/sleepy
这是一个简单,不张扬的工具,我不知道它是否适合您的需求。这对我来说已经做得很好了,作为一个相当简单的采样分析器。我正在创作一个名为SlimTune的.NET分析器,它最终将获得原生支持 - 但它现在不在那里,而且它可能需要几个月才可用。
答案 5 :(得分:0)
由于它是一个实时应用,我需要探测器尽可能快。
我不知道你的实时意思(硬,半硬,软)。
我曾经不得不提高传真服务器的性能。传真协议是这样的,如果任何一端延迟太长(几十或几百毫秒,取决于),则传真会话断开。因此我无法使用任何可供我使用的商业分析器,因为它们对服务器的执行速度太慢了:所以我添加了各种日志消息(带有时间戳)来检测代码,从而找到瓶颈
答案 6 :(得分:0)
我使用AMD CodeAnalyst效果很好,但自然它必须在AMD处理器上运行。如果你挖得足够深,那就更像是“告诉你比你想知道的更多”。 http://developer.amd.com/cpu/codeanalyst/Pages/default.aspx