DLL 缓存问题

Posted

技术标签:

【中文标题】DLL 缓存问题【英文标题】:DLL caching issues 【发布时间】:2011-09-15 09:58:19 【问题描述】:

从可能的最高性能角度来看,staticdynamic 库链接选项是否也会因为 DLL 的高速缓存未命中率而对性能产生影响?

我的想法是,当一个库被statically 链接时,整个程序被加载到一个地方或附近。但是当dynamically 链接时,DLL 可以被加载到某个地方并且它的变量可以被分配“太远”。

这是真的吗,或者就cache miss ratio 而言,DLL 没有性能损失? (仅限快速 C/C++ 代码)

【问题讨论】:

【参考方案1】:

“整个程序加载在一个地方”:系统的内存管理器仍会将可执行内存页面映射到它喜欢的物理内存 - 你无法控制它。在运行时,如果需要可执行代码的其他部分,物理页面将被换出到磁盘。

当多个进程实际上可以共享库时,使用共享库可能会减少物理内存中所需的代码页数。

总结:

NO:动态或静态链接不直接影响缓存未命中。动态链接可以减少高度重用库的缓存未命中。

【讨论】:

【参考方案2】:

我会先说简介!

物理位置不会影响访问时间。地址空间似乎是线性的,但可以虚拟映射到任何物理内存页面。

您需要自定义分配和 VirtualLock 以一些控制页面的物理位置。

注意事项

通常使用共享 DLL 通过与映射了相同图像的其他进程共享页面来缓解您精确描述的问题。这导致缓存的页面更少,交换这些页面的需要更少。

我会说数据段实际上不是映射的,而是从进程的地址私有空间分配的,因此位置可能类似于静态链接的数据段。您可以尝试使用堆调试器/可视化器来了解其工作原理)。

如果您想要一种简单的方法来获得完全控制,只需使用您喜欢的分配方案从 HEAP 分配所有内容。如果有来自 DLL 的静态数据,只需将其复制到该区域即可?

【讨论】:

【参考方案3】:

内存不需要连续以获得良好的缓存性能。缓存行大小从几个字节到几百个不等,通常比 DLL 小得多。

【讨论】:

以上是关于DLL 缓存问题的主要内容,如果未能解决你的问题,请参考以下文章

将 DLL 安装到全局程序集缓存(GAC)

visual studio插件开发dll类库免加全局缓存处理办法

直接引用MrAdvice.dll文件不能实现AOP拦截,教你1分钟解决这个问题

C#动态加载dll 时程序集的卸载问题

webpack开发与生产环境 性能优化配置 - HMR - 缓存 -tree shaking - 代码分割 - 懒加载 - 预加载 - PWA - 多进程打包 - externals - dll(代码

php数据缓存memcached 集成可视化工具