从最高性能的角度来看,static
vs dynamic
库链接选项是否也会影响性能,因为DLL的缓存缺失率较高?
我的想法是,当图书馆statically
链接时,整个程序会加载到一个地方或附近。但是当dynamically
链接时,DLL可以在某处加载,并且它的变量可以“分配得太远”。
这是真的吗,或者cache miss ratio
对DLL没有性能损失? (仅限快速C / C ++代码)
答案 0 :(得分:3)
“整个程序加载到一次”:你的系统的内存管理器仍然会将可执行内存页映射到它喜欢的物理内存 - 你无法控制它。在运行时,如果需要可执行代码的其他部分,物理页面将被换出到磁盘。
当多个进程实际共享库时,使用共享库可能会减少物理内存中所需的代码页数。
汇总:
否:动态或静态链接不会直接影响缓存未命中。动态链接可以减少高度重用库的高速缓存未命中。
答案 1 :(得分:1)
为了获得良好的缓存性能,内存不需要是连续的。缓存行大小(从几个字节到几百个)通常比DLL小得多。
答案 2 :(得分:1)
我先说一下它!
物理位置不会影响访问时间。仅的地址空间似乎是线性的,但可以虚拟映射到任何物理内存页面。
您需要自定义分配和VirtualLock才能某些控制页面的物理位置。
注释
通常使用共享DLL可以通过与具有相同映像映射的其他进程共享页面来缓解您精确概述的问题。这样可以减少缓存的页面数量,减少交换这些页面的时间。
我会说数据段实际上并未映射,而是从进程的地址私有空间分配,因此该地点可能类似于静态链接的数据集。您可以尝试使用堆调试器/可视化工具来了解其工作原理。
如果您想要一种简单的方法来获得完全控制,只需使用您的首选分配方案从HEAP分配所有内容即可。如果有来自DLL的静态数据,只需将其复制到该区域吗?