gpt4 book ai didi

C# 与 C/C++ : do I need to order struct fields manually for best performance?

转载 作者:行者123 更新时间:2023-11-30 01:50:38 24 4
gpt4 key购买 nike

我刚刚阅读了这篇关于指令和内存 CPU 缓存感知的文章:

http://www.research.scea.com/research/pdfs/GDC2003_Memory_Optimization_18Mar03.pdf

文章推理是围绕使用 C/C++。

我有三个相关的问题:

  1. C# 通常会遵循相同的规则吗?

  2. 我是否需要手动对结构字段进行排序以获得最佳性能?编译器会处理这个问题还是由于更高级别而不可能?

  3. 如果是,那么这对通用结构有何影响?例如。 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com