【发布时间】:2015-01-14 19:39:33
【问题描述】:
我们经常听说将变量与内存中的 N 字节边界对齐可以提高性能(通过防止 CPU 必须将两个单独的“字”加载到缓存中来读取我们的变量)。
另一方面,我们也听说(不太常见)将一大块内存(数组/缓冲区)对齐到一个不错的、圆形的二次幂地址可能是不好的,因为分配内存地址的散列函数缓存地址不再统一(这称为页面对齐)。
因此,我的问题是,是否有某种规则或阈值点关于我们何时应该故意不对齐数据以避免页面对齐问题?什么时候不这样做,才能获得标准内存对齐的好处?
【问题讨论】:
-
“缓存关联性”是一个很好的搜索词。希望你能用一个更好的模型来代替你大脑中的第二段。
-
这肯定与 C#、C++ 或 C 无关。尤其与 C# 无关。
-
我选择这些语言是因为它们是您最常需要考虑这些问题的语言。是的,我认为你在 C# 中也是如此。
-
C# 像 C++ 一样对齐其对象字段,以提高性能。编译器会为你做这些,你不必担心。
-
即使使用
AllocHGlobal,您也无法控制分配空间的位置。而且您的程序只能看到 虚拟 内存,这使事情变得更加复杂。此外,.NET 的 GC 进行了高度优化。除非您真的确实存在性能问题,可以通过分析您的代码并回溯到该问题来验证(这确实不太可能),否则您根本不应该打扰。
标签: c# c++ c performance caching