【问题标题】:Which is the most performant way to compare two digits?比较两位数最有效的方法是什么?
【发布时间】:2011-04-18 10:01:47
【问题描述】:

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

哪种方法最快?

一)

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

B)

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

【问题讨论】:

  • 我会说第一个(也许是因为如果第二个更快,那将是第一个在内部实现的方式)..
  • 您希望每秒钟实际运行一次比较的频率?这些数字从何而来:文件、数据库?您将它们存储在哪种类型的集合中?在大多数情况下,优化这样的语句是毫无用处的,因为它周围的一切都慢得多。

标签: c# .net performance binary comparison


【解决方案1】:

我怀疑 first 实际上更快。这并不像比较两个整数的相等性是一个不常见的操作,所以我想它得到了很好的支持:) 然而,更重要的是它更具可读性

在我看来,比较整数是否相等不太可能成为您的瓶颈。如果你真的觉得是这样,那么一定要尽可能地对你所得到的情况进行基准测试,然后尝试各种更改(可能是 XOR,可能是减法等)并重新测量。但在花时间远离最明显、最简单、最易读的代码之前,请确保您确实有需要修复的问题。

【讨论】:

  • 我已经验证了这一点,并在我的回答中进行了描述。感谢您的回答。
【解决方案2】:

回答此类问题的唯一方法是在您的特定应用程序和环境中对其进行测量。

但是先做,不要担心。在 C# 中,这将是一个问题,您可能不会做任何事情。

如果您在某些奇怪的性能极端案例中确实比 MS 工具团队更了解如何比较整数,那么您应该使用汇编程序编写代码。

就我个人而言,我无法想象在一个紧密循环中比较两个整数会支配你的时间的场景——循环和分支开销将类似于或大于比较成本,即使这样,假设这很棒数据块神奇地出现在 CPU 缓存中,无需任何分页或内存 I/O 成本。

对于比较(以及设置为零和乘以 2 的常数幂)之类的操作,Rococo 替换不适合适当的商业工具链(糟糕的嵌入式 C 编译器可能仍然需要它们)最好的部分20年。是时候停止思考它们了。

【讨论】:

  • 我已经验证了这一点,并在我的回答中进行了描述。感谢您的回答。
【解决方案3】:

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

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 毫秒

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

感谢您的回答。

【讨论】:

    【解决方案4】:

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

    【讨论】:

    • 您测量了差异吗?你确定是这种情况还是你在做一个假设?
    • 我没有测量它,因为它很难测量。由于 CPU 中的进程并发性,我编写的一个简单测试在每次启动时都会显示不同的结果。我认为看看 MSIL 拆解比测量更有效。
    • 如果你不能轻易衡量差异,那么肯定没有任何意义的差异,那么为什么更喜欢一种方法而不是另一种。甚至 MSIL 在编译时也会被优化,你也要看一下编译器,看看会发出什么字节码。在性能方面,没有什么可以选择其中之一。在可读性方面存在巨大差异,提问者应该选择第一个。
    • 如果你不能轻易衡量差异,那么肯定没有任何意义的差异 - 是的,我同意这一点。
    • 结果将取决于 Jitter 版本、CPU 类型、之前和之后的代码,......而且很可能它们会执行相同的操作。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-12
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多