Какой самый эффективный способ сравнить две цифры? - PullRequest
3 голосов
/ 18 апреля 2011

Мне нужно сравнить множество целочисленных значений с равенством.

Какой метод самый быстрый?

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 ]

8 голосов
/ 18 апреля 2011

Я подозреваю, что сначала все равно быстрее. Это не то же самое, что сравнение двух целых чисел на равенство - это необычная операция, поэтому я думаю, что она довольно хорошо поддерживается :) Однако гораздо важнее то, что она намного, намного более читаема .

Мне кажется очень маловероятным, что сравнение целых чисел на равенство станет вашим узким местом. Если вы действительно чувствуете, что это так, то непременно оцените, что вы попали в настолько реалистичную ситуацию, насколько это возможно, затем попробуйте различные изменения (возможно, XOR, возможно вычитание и т. Д.) И повторите измерение. Но убедитесь, что у вас действительно есть что-то, что вам нужно исправить, прежде чем тратить время на то, чтобы отойти от наиболее очевидного, простого и удобочитаемого кода.

5 голосов
/ 18 апреля 2011

Единственный способ ответить на такой вопрос - это измерить его в вашем конкретном приложении и среде.

Но сделайте первый и не беспокойтесь об этом.В C # вы, скорее всего, ничего не сделаете, где это может стать проблемой.

Если вы находитесь в каком-то странном случае с производительностью, где вы действительно лучше знаете, как сравнивать целые числа, чемКоманда MS tools, тогда вы должны писать на ассемблере.

Лично я не могу представить сценарий, в котором сравнение двух целых чисел в тесном цикле будет доминировать в вашем времени - затраты на цикл и ветвление будут похожиили больше, чем стоимость сравнения, и даже в этом случае предполагается, что этот большой блок данных волшебным образом появился в кэше ЦП без каких-либо затрат на пейджинг или ввод-вывод памяти.

Подстановки в рококо для операций, подобных сравнениям (иравные нулю и умноженные на константу степени два) не подходили для надлежащих коммерческих цепочек инструментов (их могут по-прежнему нуждаться в потрясающих встроенных компиляторах C) в течение большей части 20 лет.Пора перестать думать о них.

1 голос
/ 18 апреля 2011

Я написал код для проверки.

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 миллисекунд

Похоже, что эти методы работают идентично.

Спасибо за ваши ответы.

1 голос
/ 18 апреля 2011

Первый.Потому что они оба выполняют операцию сравнения (==), а вторая использует дополнительную операцию XOR.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...