Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/293.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语言中最快的位运算#_C#_Performance_Bit Manipulation - Fatal编程技术网

C# C语言中最快的位运算#

C# C语言中最快的位运算#,c#,performance,bit-manipulation,C#,Performance,Bit Manipulation,在C#中,任何特定的位运算(AND、OR、XOR等)是否比另一种更快 我问这个问题的原因是因为我知道,在硬件中,大多数东西都是使用与非门构建的,因为少数与非门可以复制任何其他门。这对高级编程语言有什么影响吗?或者中间的所有抽象层都使它们以相同的速度运行 我意识到从中获得的任何性能提升都是微不足道的,我只是出于好奇而问 编辑:请停止试图解释没有功能原因知道这一点。这简直就是好奇 但是,我通过对两个数字执行某些位操作来生成哈希代码。使用尽可能最便宜/最快的操作是有意义的。再说一次,这没什么区别,我只

在C#中,任何特定的位运算(AND、OR、XOR等)是否比另一种更快

我问这个问题的原因是因为我知道,在硬件中,大多数东西都是使用与非门构建的,因为少数与非门可以复制任何其他门。这对高级编程语言有什么影响吗?或者中间的所有抽象层都使它们以相同的速度运行

我意识到从中获得的任何性能提升都是微不足道的,我只是出于好奇而问

编辑:请停止试图解释没有功能原因知道这一点。这简直就是好奇

但是,我通过对两个数字执行某些位操作来生成哈希代码。使用尽可能最便宜/最快的操作是有意义的。再说一次,这没什么区别,我只是好奇

编辑:我的问题归结为:硬件依赖于较低级别的与非门这一事实对较高级别的进程有影响吗。这会导致NAND比XOR快吗


我问这个问题是出于对硬件细节如何影响软件的好奇。我很感兴趣。

CPU是由时钟驱动的同步逻辑引擎。这些低级操作都在一条指令中执行

在C#中,任何特定的位运算(AND、OR、XOR等)是否比另一种更快

我创建了一个基准:

Random r = new Random();
int a = r.Next();
int b = r.Next();
int c = 0;
Stopwatch sw = new Stopwatch();

sw.Start();
for (int i = 0; i < int.MaxValue; i++)
{
    c += a & b;
}
sw.Stop();
Console.WriteLine("AND operator: {0} ticks", sw.Elapsed.Ticks);
Console.WriteLine("Result: {0}", c);
c = 0;
// The above is just to make sure that the optimizer does not optimize the loop away,
// as pointed out by johnnycrash in the comments.
sw.Restart();
for (int i = 0; i < int.MaxValue; i++)
{
    c += a | b;
}
sw.Stop();
Console.WriteLine("OR operator: {0} ticks", sw.Elapsed.Ticks);
Console.WriteLine("Result: {0}", c);
c = 0;
for (int i = 0; i < int.MaxValue; i++)
{
    c += a ^ b;
}
sw.Stop();
Console.WriteLine("XOR operator: {0} ticks", sw.Elapsed.Ticks);
Console.WriteLine("Result: {0}", c);
c = 0;
for (int i = 0; i < int.MaxValue; i++)
{
    c += ~a;
}
sw.Stop();
Console.WriteLine("NOT operator: {0} ticks", sw.Elapsed.Ticks);
Console.WriteLine("Result: {0}", c);
c = 0;
for (int i = 0; i < int.MaxValue; i++)
{
    c += a << 1;
}
sw.Stop();
Console.WriteLine("Left shift operator: {0} ticks", sw.Elapsed.Ticks);
Console.WriteLine("Result: {0}", c);
c = 0;
for (int i = 0; i < int.MaxValue; i++)
{
    c += a >> 1;
}
sw.Stop();
Console.WriteLine("Right shift operator: {0} ticks", sw.Elapsed.Ticks);
Console.WriteLine("Result: {0}", c);

AND运算符需要更长的时间,因为它是第一个循环。例如,如果我切换AND和OR循环,则OR循环需要更多的时间。

性能提升不是最小的,而是无穷小的。另外,代码质量>显然不需要的代码优化。即使你没有太多的硬件层,它也没有任何意义,.NET代码运行在各种不同的处理器(甚至架构)上,所以C#没有一个单一的答案。这没关系,我只是想理解,没有人会阻止您尝试编写自己的suss基准测试,这真的很难以有意义的方式回答,因为不同平台和运行时可能会有所不同。不要尝试进一步扩展,编写高性能代码的最佳方法是先设定性能目标,然后写下你能想到的实现功能的最直接的方法。然后测量性能,如果不可接受,则分析代码以确定将精力集中在哪里,甚至发现算法的复杂度顺序错误。通过在每个步骤中对每个可能的备选方案进行微观分析并尝试将它们组合起来,您不会编写高性能代码。是的,OR可能在一个周期内完成,但使用OR in代码可能会导致从内存中加载一个或两个值,执行该操作,并可能将结果存储回内存。这对我来说是有意义的,尽管这是一个稍微令人失望的答案。谢谢@Servy:这对AND或XOR有什么影响?@YvesDaoust事实上你从来没有真正做过这些操作中的一个;如果你在测量/比较它们,你几乎肯定是在测量其他东西。@Nealon:实际上,现代处理器的行为非常复杂(流水线执行、多管道、推测性分支和执行、缓存级别),几乎是不确定的。根据上下文的不同,同一条指令的延迟可能大不相同。真正的改进是通过确保良好的局部性、避免数据依赖性和禁止分支来实现的。这非常有用,谢谢。在我的系统中,优化器将操作从循环中拉出,因此测量的只是循环计数器的增量和测试。实际上,由于生成的c从未使用过,正在测试的代码已被完全删除。@johnnycrash如果禁用优化是否有效?如果将“c”添加到WrtiteLine语句并保持优化处于打开状态,则有效。似乎可以将其添加到第一个writeln中,优化器会在所有循环中不断计算c。优化器没有那么令人印象深刻。。。阿尔索
AND operator: 7979680 ticks
OR operator: 7826806 ticks
XOR operator: 7826806 ticks
NOT operator: 7826806 ticks
Left shift operator: 7826806 ticks
Right shift operator: 7826806 ticks