我正在考虑在 C# 中进行一些按位运算,并希望确保充分利用 CPU 和总线。我还想构建我的内存数据,这样它就不会产生不必要的负载(将数据与内存页面对齐)。
作为 .NET 开发人员,我能否针对内存数据结构和对齐方式实现硬件/CPU 特定优化?
我正在考虑在 C# 中进行一些按位运算,并希望确保充分利用 CPU 和总线。我还想构建我的内存数据,这样它就不会产生不必要的负载(将数据与内存页面对齐)。
作为 .NET 开发人员,我能否针对内存数据结构和对齐方式实现硬件/CPU 特定优化?
对于位移(注释)之类的事情,只要您在标准数据边界上工作就没有关系 - CPU 将以尊重 CPU 字节顺序的方式进行移动。但是,如果您的数据“自然”是一个字节数组,并且您将它视为一个长数组作为通过“不安全”进行的优化,那么这很重要:左移一个 long 与左移 8 个字节非常不同独立。不过,“关于数据类型的谎言”可能是一个有用的优化:例如,web-sockets 屏蔽是作为一个 32 位 xor 应用于数据的,这是一个字节序列。通过一些技巧,可以通过减少数量的 64 位 xor 以及最多 7 个单独的 xor 来完成。
您可以使用FieldOffsetAttribute控制数据的内存表示。这是类/结构定义的一部分,因此它不能在运行时更改,尽管您可以针对 x86 优化一个,针对 x64 优化一个,并在运行时决定使用哪个。
不过,您的问题的标题提出了不同的问题。只要您通过内置操作执行按位操作,运行时就会负责将您的代码映射到语义等效的指令。我想说的是:
byte f(byte a, byte b){return a ^ b;} // or whatever
必须在它运行的每个平台上表现相同。如果您这样做“不安全”,Marc Gravell 的评论确实适用。这可能是你打算做的 - 我有点不清楚。