Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/290.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 当在C中做位运算时,除了X64还是x86之外,我是否还要考虑CPU?_C#_.net_64 Bit_32bit 64bit_Micro Optimization - Fatal编程技术网

C# 当在C中做位运算时,除了X64还是x86之外,我是否还要考虑CPU?

C# 当在C中做位运算时,除了X64还是x86之外,我是否还要考虑CPU?,c#,.net,64-bit,32bit-64bit,micro-optimization,C#,.net,64 Bit,32bit 64bit,Micro Optimization,我正在考虑在C#中执行一些位操作,并希望确保充分利用CPU和总线。我还希望构造内存中的数据,这样就不会产生不必要的负载(将数据与内存页对齐) 作为一名.NET开发人员,我是否可以在内存数据结构和对齐方面实施特定于硬件/CPU的优化?对于位移位(注释)之类的事情,只要您在标准数据边界上工作,就无所谓了-CPU将以尊重CPU端性的方式移动。但是,如果您的数据“自然”是一个字节数组,并且您通过“不安全”将其视为一个长数组进行优化,那么这将很重要:左移一个长数组与单独左移8个字节非常不同。“关于数据类型

我正在考虑在C#中执行一些位操作,并希望确保充分利用CPU和总线。我还希望构造内存中的数据,这样就不会产生不必要的负载(将数据与内存页对齐)


作为一名.NET开发人员,我是否可以在内存数据结构和对齐方面实施特定于硬件/CPU的优化?

对于位移位(注释)之类的事情,只要您在标准数据边界上工作,就无所谓了-CPU将以尊重CPU端性的方式移动。但是,如果您的数据“自然”是一个字节数组,并且您通过“不安全”将其视为一个长数组进行优化,那么这将很重要:左移一个长数组与单独左移8个字节非常不同。“关于数据类型的谎言”可能是一个有用的优化:例如,web套接字屏蔽是在32位异或应用于数据时完成的,这是一个字节序列。通过一些技巧,这可以通过减少64位异或的数量,再加上最多7个单独的异或来实现。

您可以使用。这是类/结构定义的一部分,因此在运行时不能更改,不过您可以针对x86和x64分别优化一个,并在运行时决定使用哪个

不过,你问题的标题提出了一些不同的问题。只要您通过内置操作执行逐位操作,运行时就会负责将代码映射到语义等价的指令。我想说的是:

byte f(byte a, byte b){return a ^ b;} // or whatever

必须在其运行的每个平台上表现相同。Marc Gravell的评论确实适用于“不安全”的情况。这可能是您打算做的-我有点不清楚。

最好的办法是首先让您的程序工作,然后分析它以了解性能问题所在,然后再对其进行优化。具体是什么类型的操作?@MarcGravell位移位、位比较,等等。我正在使用许多高达10000位的阵列,并且正在考虑如何射中自己的脚。请注意John的评论。另外,作为.NET开发人员,为什么要担心硬件,它总是会改变的。C#/.Net的优点在于你不在乎;抖动将为您优化。如果您非常关心这些问题,那么请使用C或更好的汇编语言(检查时使用)。所有的QA单元测试都通过了,我有空闲时间来探索这一点。我不知道我是否有性能问题,因为我没有什么可以比较的。这个问题将允许我创建一个“优化”的基线进行比较。我对低级编程是新手,感觉标题没有反映问题的主体。我的目标是看看C#能在低级别操作方面做些什么?您的FieldOffsetAttribute示例很有趣,并且与我正在寻找的内容相关。你有什么建议吗?我没有任何第一手经验,这取决于你想做什么。如果你打算把8字节当作64位长的字节,你必须理解它的C#语义(如Marc所说),但我猜这就是你将如何获得主要性能改进的方法。但是,根据您的情况,在非托管C++中编写此关键代码可能会更有意义,并生成不同的X64和X86二进制文件。然后你就可以完全访问你想要的一切。