我在开发自己的游戏发动机的公司中工作。它的功能之一是动态加载和卸载DLL(插件)。每当我的过程释放一个特定于特定的DLL时,我都会注意到一种奇怪的行为 - 这会导致大幅下降。 我已经尝试了无数的尝试来识别引起问题的原因(请参见下文),但似乎没有任何作用。 chatgpt的建议是没有用的,我不知道从这里有什么关系。

问题描述 投票:0回答:0
加载应用仅加载此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钩子。
c++ performance winapi dll loadlibrary
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.