【问题标题】:DLL caching issuesDLL 缓存问题
【发布时间】:2011-09-15 09:58:19
【问题描述】:
从可能的最高性能角度来看,static 与 dynamic 库链接选项是否也会因为 DLL 的高速缓存未命中率而对性能产生影响?
我的想法是,当一个库被statically 链接时,整个程序被加载到一个地方或附近。但是当dynamically 链接时,DLL 可以被加载到某个地方并且它的变量可以被分配“太远”。
这是真的吗,或者就cache miss ratio 而言,DLL 没有性能损失? (仅限快速 C/C++ 代码)
【问题讨论】:
标签:
c++
c
caching
dll
shared-libraries
【解决方案1】:
“整个程序加载在一个地方”:系统的内存管理器仍会将可执行内存页面映射到它喜欢的物理内存 - 你无法控制它。在运行时,如果需要可执行代码的其他部分,物理页面将被换出到磁盘。
当多个进程实际上可以共享库时,使用共享库可能会减少物理内存中所需的代码页数。
总结:
NO:动态或静态链接不直接影响缓存未命中。动态链接可以减少高度重用库的缓存未命中。
【解决方案2】:
我会先说简介!
物理位置不会影响访问时间。地址空间似乎是线性的,但可以虚拟映射到任何物理内存页面。
您需要自定义分配和 VirtualLock 以一些控制页面的物理位置。
注意事项
如果您想要一种简单的方法来获得完全控制,只需使用您喜欢的分配方案从 HEAP 分配所有内容。如果有来自 DLL 的静态数据,只需将其复制到该区域即可?
【解决方案3】:
内存不需要连续以获得良好的缓存性能。缓存行大小从几个字节到几百个不等,通常比 DLL 小得多。