分析dll插件
Profiling a dll plugin
我想在c++中配置一个dll插件。我可以访问源代码(作为作者/维护者),并可以修改它们(如果需要检测)。我没有的是调用dll的主程序的源/符号/等。我只需要建立插件的头。在客户端操作时调用dll。
分析代码的最佳方法是什么?在dll周围"包装"可执行文件是不现实的,这将是无用的,因为在插件中,我从主机调用一些函数,并且我需要配置这些路径,包装器会扭曲性能。
编辑Kieren Johnston的评论后:理想情况下,我想挂钩到加载的dll就像调试器能够(附加到运行的主机进程,并根据需要在dll的某个地方放置一个断点)。这可能吗?如果没有,我需要问另一个问题来问为什么:-)
我使用的是Visual Studio 2010的TFS版本。
为AIX下的相同任务提供建议/答案可以加分(啊,多环境的乐趣!)
这是可能的,尽管有点烦人。
- 将插件DLL部署到主机应用程序需要它的位置 启动主机应用程序并验证它正在使用插件
- 创建一个新的性能会话
- 添加主机EXE作为目标从步骤3
- 为您的会话选择采样或仪器
- 启动配置会话
在此期间保持插件解决方案加载,VS会自动为您的插件找到符号。
不确定VS10,但在旧版本中,您通过指定运行它的exe来调试dll。
让我们把这个问题分成两部分:1)定位你可能称之为"瓶颈"的地方,2)衡量通过修复每个瓶颈所获得的总体加速。
(2)很简单,对吗?你所需要的只是一个外部计时器。
剩下(1)。如果你和大多数人一样,你认为如果没有对程序的各个部分进行某种精确的计时,就不可能找到"瓶颈"。并非如此,因为大多数时候,你需要修复的东西并不是你可以通过这种方式检测到的。它们不一定是糟糕的算法,或者慢的函数,或者热点。它们是分布式的东西,由看起来非常无辜的精心设计的代码完成,如果以不同的方式编码,恰好提供了巨大的加速机会。
下面是一个编写得相当好的程序的例子,它的执行时间从48秒减少到20、17、13、10、7、4、2.1,最后是1.1,经过8次迭代这是一个超过40倍的复合加速因子。在每个不同的程序中,你能得到的加速因子是不同的——有些可以得到更少,有些可以得到更多,这取决于它们在一开始离最优值有多近。如何做到这一点并不神秘。方法是随机暂停。(这是使用分析器的另一种选择。分析器测量各种各样的东西,并给你各种线索,这些线索可能有帮助,也可能没有帮助,但它们并不能可靠地告诉你问题是什么。
**每次迭代获得的加速因子分别为2.38、1.18、1.31、1.30、1.43、1.75、1.90、1.91。另一种说法是每次迭代减少的时间百分比:58%,15%,24%,23%,30%,43%,48%,48%。我从分析器的粉丝那里得到了一段艰难的时光,因为这种方法是如此手动,但他们从不谈论加速结果。(也许会改变)
- 我可以用C++/WinRT编写一个DLL,供windows桌面应用程序(而不是UWP)或Unity插件使用吗
- C++插件不能延迟加载dll时
- 带有 Gradle cpp 插件的 Buld DLL
- 节点插件节点-gyp 构建缺少 V8 dll 的
- Maven NAR插件:在路径上找不到DLL依赖项
- Eclipse插件,调用C DLL
- 插件框架,参数传递,C ,DLL,GDI
- DLL(VST插件)中的Qt GUI环境
- 如何使 *.dll WinAmp 插件在朋友电脑上工作
- 部署Qt-dll文件-找不到windows插件,尽管平台/qwindows.dll存在,因此存在libEGL和libGL
- 插件 DLL 引用的 DLL 的搜索路径
- 在虚幻4插件中链接DLL
- 如何保留我的unity3d程序(c#v3.5),即使c ++ dll /本机插件中有exit(1)
- 两个插件链接到具有不同实现(代码)的同名 DLL 或共享库对象 (so)
- 在插件(DLL)中使用Qt网络模块
- 用于具有插件、dll和第三方工具的大规模c++项目的结构
- 我可以使用NPAPI在一个DLL中创建多个插件吗
- 是否有任何已知的技术可以使用将 DLL 插件分离到它自己的进程中?
- 如何用c#编写调用c++ DLL导出函数的excel插件
- 试图使一个.dll插件,但通过程序调试给出了错误