哪个是比较两位数最高效的方法?

时间:2011-04-18 10:01:47

标签: c# .net performance binary comparison

我需要将很多整数值与等式进行比较。

哪种方法最快?

A)

int a1 = 12345;
int a2 = 54321;
if(a1 == a2)
{
   //do something.
}

B)

int a1 = 12345;
int a2 = 54321;
if( (a1 ^ a2) == 0 )
{
   //do something.
}

4 个答案:

答案 0 :(得分:8)

我怀疑无论如何首先实际上更快。这并不是比较两个整数的相等是一种不常见的操作,所以我认为它得到了很好的支持:)但是,更重要的是它更多,更具可读性

对我来说似乎不太可能比较整数是否是你的瓶颈。如果你真的觉得它是,那么无论如何都要将你所拥有的东西作为现实情况进行基准测试,然后尝试各种变化(可能是异或,也许是减法等)并重新测量。但是,确保在花时间摆脱最明显,简单易读的代码之前,确实已经得到了一些你需要修复的东西。

答案 1 :(得分:5)

回答这样的问题的唯一方法是在特定的应用程序和环境中测量它。

但是先做,不要担心。在C#中你没有什么可能做的,这将成为一个问题。

如果你处于一个奇怪的角色表现,你真的比MS工具团队更了解如何比较整数,那么你应该用汇编语言写作。

就个人而言,我无法想象一个场景,即紧密循环中两个整数的比较会占据你的时间 - 循环和分支开销将与比较成本相似或更高,即便如此,这也是假设数据块神奇地出现在CPU缓存中,没有任何分页或内存I / O成本。

像比较(以及设置为零和乘以2的乘法)这样的操作的洛可可替换不适合于适当的商业工具链(craptastic嵌入式C编译器可能仍然需要它们)以获得最佳部分20年。现在是时候停止思考它们了。

答案 2 :(得分:1)

第一个。因为它们都执行比较操作(==),但第二个操作使用额外的XOR操作。

答案 3 :(得分:1)

我已经编写了一些代码来验证这一点。

static void Main( string[] args )
{
  int a1 = 123456;
  int a2 = 654321;
  int a3;

  var t = new System.Diagnostics.Stopwatch();
  t.Start();
  for ( int i = 0; i < int.MaxValue; i++ )
  {
    if ( a1 == a2 )
    {
      a3 = a1 + a2;
    }
  }
  t.Stop();

  Console.WriteLine( t.ElapsedMilliseconds );

  t.Reset();

  t.Start();
  for ( int i = 0; i < int.MaxValue; i++ )
  {
    if ( ( a1 ^ a2 ) == 0 )
    {
      a3 = a1 + a2;
    }
  }
  t.Stop();

  Console.WriteLine( t.ElapsedMilliseconds );

  Console.ReadKey();
}

结果是下一个:
对于第一个 6275 毫秒
对于第二个 6277 毫秒

看起来这些方法的工作原理相同。

感谢您的回答。