LoadLibrary的性能有关问题

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中所有的地址引用都加一个偏移量,显然这是一个很耗时间的过程.