加载应用仅加载此DLL(带有LoadLibrary()),然后卸载它(使用Freelibrary())
一旦完成,我们可以看到一个主要的性能降级。
this仅在Debug上发生。
我已经尝试过的地方:
我使用VS分析工具来查看任何瓶颈。什么都没有出现。还检查了内存泄漏,IO以及VS必须提供的所有内容。
I编写了一个简单的程序,除了加载DLL并卸载DLL外,什么都不做,并且在我做一些“计算”的方式之间,通常需要大约3秒钟。它一致地表明,在卸载DLL后,我们将获得大约30%的性能降级,如果我们尝试重新加载它,我们将获得约400%的性能下降(现在任务大约需要12秒)。 (从游戏引擎进行相同的实验时,我们从约120fps下降到0.5 fps,因此性能下降甚至更高)。
看该dll的代码 - 确保只有这个问题才是这个问题。我查看UCRT实现,并试图识别初始化的每个全局和静态变量(有很多)。
我去了我能找到的每个构造函数和驱动器,并使他们的实施变得琐碎。确保没有锁,没有关键部分,也没有等待加入的线程。确保不会覆盖内存分配(它们是,以使分配是对齐的)。
- 我看了看Procmon,看看我是否可以发现某些东西,但无法(尽管我的知识非常有限)。
看着“依赖”,以查看我是否得到提示。没什么
- I在loadLibrary()()(和Freelibrary())之后调试代码,以查看是否有一些悬挂线程或无法正确释放的资源 - 找不到任何东西 - 找不到任何东西。
- 唯一起作用的是我使用DLL加载:
loadLibraryex给定标志:load_library_as_image_resource,但这不是很有帮助,因为在这种情况下,全局和静态变量未初始化。
我阅读了可能与TLS相关的建议 - 我尝试找到具有相关代码的所有位置并将其删除。
我没有做的事情:-
链接该DLL具有的所有静态和动态(它链接到其他大约10个DLL,以及许多Windlls)。这根本不是微不足道的,因为此dll中有成千上万的参考。
在所有静态和全球变量中,都有10000多个。
在这一点上,我迷失了,我会欣赏和建议,工具,想法。
基本上从我们的实施中删除所有可能的代码之后 - 事实证明,我们有一个(愚蠢的)包装类包装MFCleakReport类。
- 中,有人打电话给
_crtsetReporthook- 。删除这些电话完全解决了问题。至于为什么我的公司在那里,或者如何正确实施它与解决方案无关 - 但是,如果有人遇到类似的行为 - 尝试寻找MFC钩子。