首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > VC/MFC >

LoadLibrary的性能有关问题

2012-03-05 
LoadLibrary的性能问题LoadLibrary的速度很慢,我连续把12个dll依次LoadLibrary发现总共花费了7秒钟的时间,

LoadLibrary的性能问题
LoadLibrary的速度很慢,我连续把12个dll依次LoadLibrary发现总共花费了7秒钟的时间,而我如果用ReadFile读取这些文件也就不到一秒钟的时间,请问这些时间都花费在什么地方了?有没有方法能提升LoadLibrary的速度?隐式load速度会比显式load快么?thx!

[解决办法]
mark
等待高手
[解决办法]
。。。。
[解决办法]
关于这方面的内容,可以参考MSDN的What Goes On Inside Windows 2000: Solving the Mysteries of the Loader一文。
如果你想提升速度的话,那就把那堆LoadLibrary放到另一个线程里去做吧,这样看起来的话主线程不至于无响应,效果更好一些。
[解决办法]
LoadLibrary大致过程
1、系统读取DLL文件
2、将其映射到你的进程空间
3、调用DLL导出函数DllMain

前两步应该不会有你说的这么慢,猜想可能你的DLL的DllMain函数耗费时间。

DllMain函数一般在DLL_PROCESS_ATTACH处理中,对内部的数据进行初始化或者一些其他准备工作。
你的DLL是否有源码,你可以检查看看DllMain

另外,隐式和显式效率应该没什么差别,只不过隐式链接在进程启动的时候完成上述步骤,导致你的程序启动会比现在慢。
[解决办法]
不会那么慢。
应该是在DllMain里做了特别的处理
[解决办法]
测试一下LoadLibrary还是很快的,
可能想楼上所说DllMain里面问题
[解决办法]
在映射阶段可能会出现"Rebasing"的情况,即这些DLL的Base都是一样的,但是它们是不可能被映射到同一内存区域的,Loader就需要重新为它们计算新的基址.
[解决办法]
DllMain中做特殊处理的一般比较少。

1、你的DLL还使用了其它DLL,导致远超过12个的DLL需要加载;
2、程序运行时的内存可能比较紧张(或者该程序可以使用的内存有限),使得OS不停的出现换页操作;
3、用ReadFile和这个没有可比性,充其量ReadFile只是LoadLibrary的一个真子集;

[解决办法]
你这个7秒时间是怎么测出来的?
[解决办法]
测试一下哪个最慢?分析之。
[解决办法]

留个脚印,看结果
7秒确实多了些,对慢的原因很好奇,

分析测试总是很麻烦的事,
没有快,只有更快。

[解决办法]
dll里面有全局变量啊,什么的,初始化也占用些时间.
[解决办法]
合并DLL似乎并无影响,前面高手们也介绍过Load的过程了,所以最有影响的就是你的初始化代码,事实上如果LoadLibrary一个DLL他的没有ProcessAttach处理代码是相当快的,因为,他的读入过程是使用FileMapping,导入其它的DLL如果系统已经载入,他再做映射,至于它的导出只是一个重定位,所以代码过程相当快。

综上所述,LoadLibrary的速度与DLL实现相关,它是否会载入其它DLL,以及其它DLL的ProcessAttach处理时间,以及自身的Processattach时间。
[解决办法]
收藏
[解决办法]
楼主理解问题.
[解决办法]
Why LoadLibrary is much slower than GetModuleHandle for dll that is already loaded?

One of the kernel developer answered the question below:

引用LoadLibrary(AlreadyLoadedModule) has to increment the reference count of AlreadyLoadedModule,
plus all of that module's dependencies, and their dependencies, recursively. Since the dependencies are
recorded by name, not by a pointer to the loader entry, finding each dependency requires applying the
isolation/redirection info in the activation context. For a module with a lot of imports, or imports which
have their own large trees, this makes a LoadLibrary call quite expensive, even if it's already loaded.

[解决办法]
LoadLibrary慢(或者开头静态加载许多dll慢)的原因:
每个dll都要加载到某个基地址,但是这么多dll不可能都加载到同样的基地址,于是其中的某些dll不得不被调整,也就是把dll中所有的地址引用都加一个偏移量,显然这是一个很耗时间的过程.



如何解决:
Windows有一个Rebase工具,可以模拟exe加载dlls的过程,提前计算出各个dll的偏移量.此外还有其他加速的方法,不一一赘述.具体请参见<windows核心编程>第20章.
[解决办法]
LoadLibrary需要查找要加载的文件(如果你没有指定路径), 要映射文件进你的进程空间(包括代码重定位), 要解决引入表(加载所有代码用到的dll--对每个dll都重复一遍整个LoadLibrary过程), win2000以后还要根据manifest的定义查找并加载不同版本的runtime library,要初始化所有全局变量和线程局部变量(tls), 最后才是调用dllmain, 你认为这个过程快得了?

热点排行