2010-11-10 70 views
13

我为游戏制作了一个GUI库。我的测试演示以60 fps运行。当我使用我的库的静态版本运行此演示时,它在taskmanager中占用2-3%的cpu。当我使用DLL版本时,它使用大约13-15%。这是正常的吗?是的,我怎么能优化它?我已经要求它使用/ O2来实现大多数函数内联。DLL比静态链接慢吗?

+4

你是否对你的应用进行了简介? – 2010-11-10 22:23:41

+1

您应该分析并查看重要区别在哪里。 – 2010-11-10 22:23:58

+2

没有理由分析。不明白的猜测应该足以找出应用程序中可能出现的瓶颈。地狱,甚至不需要看源代码。 – 2010-11-10 22:38:53

回答

16

直到DLL有机会一次执行其功能时,才启动性能计时器。这使得它有时间加载到内存中。然后启动计时器并检查性能。它应该基本上匹配静态库。

还要记住,DLL的加载位置可以极大地影响它加载的速度。 DLL的默认基地址是0x400000。如果您在该位置已经有其他的DLL,那么加载过程必须执行一个昂贵的重新寻址步骤,这将进一步推迟您的时间。

如果你有这样的冲突,只需在Visual Studio中选择一个不同的基地址即可。

+3

提及基地址问题。 – 2010-11-10 22:27:56

+0

基址问题只会在加载时出现问题。 – 2011-03-03 23:52:55

5

你将有加载DLL的开销(应该只是在开始时)。它不是直接调用的静态链接,所以我期望有少量的开销,但不会太多。

但是,有些DLL会有更高的开销。我正在考虑COM对象,尽管可能有其他例子。 COM在对象之间的函数调用中增加了很多开销。

0

对于什么是静态/动态链接有点不清楚。您的lib的DLL是否与其依赖关系静态链接?是否有可能DLL正在调用其他DLL(这会很慢)?也许尝试在你的可执行文件中运行valgrind中的profiler来确定所有CPU使用率来自哪里。

5

如果您调用DLL函数,则不能为调用者内联。你应该考虑一下你的DLL边界。

可能是因为你的应用程序有一个小的引导程序exe,它只是在你的DLL中执行一个主循环更好。这样可以避免函数调用的大量开销。