- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我刚刚阅读了这篇关于指令和内存 CPU 缓存感知的文章:
http://www.research.scea.com/research/pdfs/GDC2003_Memory_Optimization_18Mar03.pdf
文章推理是围绕使用 C/C++。
我有三个相关的问题:
C# 通常会遵循相同的规则吗?
我是否需要手动对结构字段进行排序以获得最佳性能?编译器会处理这个问题还是由于更高级别而不可能?
如果是,那么这对通用结构有何影响?例如。 struct Triple < T1, T2, T3 > {/.../}
最佳答案
Will C# generally follow same rules?
C# 与 C 和 C++ 存在相同的问题,未对齐的结构会导致某些(可能是大多数)架构的性能受到影响。
Do I need to order struct fields manually for the best performance? Will compiler take care of this or it's not possible due to higher level?
虽然这可能是允许的,但实际上 Microsoft 编译器默认情况下不会处理这个问题。 [StructLayout(LayoutKind.Auto)]
(这是默认值)对于结构通常与 [StructLayout(LayoutKind.Sequential)]
相同.在 C 中,结构成员必须是顺序的,在 C# 中,它们也遵循这一选择。
当然,编译器会尝试对齐结构成员,因为它们优化的是性能而不是空间。在您的特定场景中,您可能已经发现优化空间确实可以提高性能,但这对于编译器来说太复杂了,无法推断。
If yes, then how does this affect generic structures? E.g. struct Triple < T1, T2, T3 > { /.../ }
当您看到 Triple<T1, T2, T3>
的定义时,您在代码中看到的是所谓的(在 MSDN 中)通用类型定义。每次实例化此泛型定义的类型参数的新组合时,环境都会创建一个新的运行时类型(您可能会看到它的名称类似于 Triple'1
)。生成的类型不再与非泛型类型不同,我看不出 JIT 编译器为何会以不同方式对待它(当然,我也可能是错的)。
关于C# 与 C/C++ : do I need to order struct fields manually for best performance?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27232712/
我是一名优秀的程序员,十分优秀!