我为游戏制作了一个GUI库。我的测试演示以60 fps运行。当我使用我的库的静态版本运行此演示时,在taskmanager中需要2-3%的CPU。当我使用DLL版本时,它使用大约13-15%。这是正常的吗?是这样,我怎么能优化它?我已经要求它使用/ O2进行大多数函数内联。
答案 0 :(得分:16)
在DLL有机会执行一次其功能之前,请不要启动性能计时器。这使它有时间加载到内存中。然后启动计时器并检查性能。然后它应该基本上匹配静态库。
另请注意,DLL的加载位置会极大地影响加载的速度。 DLL的默认基本地址是0x400000。如果你已经在该位置有一些其他DLL,那么加载过程必须执行一个昂贵的重新寻址步骤,这将使你的时间更加摒弃。
如果您遇到此类冲突,只需在Visual Studio中选择其他基本地址即可。
答案 1 :(得分:5)
您将有加载DLL的开销(应该只在开头一次)。它与直接调用没有静态链接,因此我预计会有少量开销,但不会太多。
但是,某些DLL会有更高的开销。我正在考虑COM对象,尽管可能还有其他例子。 COM在对象之间的函数调用上增加了很多开销。
答案 2 :(得分:5)
如果调用DLL函数,则无法为调用者内联它们。你应该考虑一下你的DLL边界。
可能是你的应用程序有一个小的bootstrap exe,它只是在你的DLL中执行一个主循环。这样就可以避免函数调用的大量开销。
答案 3 :(得分:0)
关于什么是静态/动态链接,有点不清楚。您的lib的DLL是否与其依赖项静态链接? DLL是否可能正在调用其他DLL(这会很慢)?也许尝试在可执行文件上运行valgrind的探查器,以确定所有CPU使用的来源。