Самый быстрый способ увидеть, сколько байтов равны между массивами фиксированной длины - PullRequest
11 голосов
/ 22 сентября 2008

У меня есть 2 массива из 16 элементов (символов), которые мне нужно «сравнить» и посмотреть, сколько элементов равно между этими двумя.

Эта подпрограмма будет использоваться миллионы раз (обычный запуск - около 60 или 70 миллионов раз), поэтому мне нужно, чтобы она была максимально быстрой. Я работаю на C ++ (C ++ Builder 2007, для записи)

Прямо сейчас у меня есть простое:

matches += array1[0] == array2[0];

повторяется 16 раз (так как профилирование кажется на 30% быстрее, чем при выполнении цикла for)

Есть ли другой способ, который мог бы работать быстрее?

Некоторые данные об окружающей среде и сами данные:

  • Я использую C ++ Builder, который не учитывает оптимизацию скорости. В конце концов я попробую с другим компилятором, но сейчас я застрял с этим.
  • Данные будут отличаться в большинстве случаев. 100% равных данных обычно очень и очень редко (возможно, менее 1%)

Ответы [ 15 ]

0 голосов
/ 22 сентября 2008

Всегда есть старая добрая инструкция x86 REPNE CMPS.

0 голосов
/ 22 сентября 2008

Есть ли способ изменить способ хранения массивов? Сравнение 1 байта за раз крайне медленное, учитывая, что вы, вероятно, используете 32-битный компилятор. Вместо этого, если вы сохранили свои 16 байтов в 4 целых числах (32-разрядных) или 2 длинных (64-разрядных), вам потребуется выполнить только 4 или 2 сравнения соответственно.

Вопрос, который нужно задать себе, состоит в том, сколько стоит хранение данных в виде 4-целых или 2-длинных массивов. Как часто вам нужен доступ к данным и т. Д.

0 голосов
/ 22 сентября 2008

Попробуйте использовать указатели вместо массивов:

p1 = &array1[0];
p2 = &array2[0];
match += (*p1++ == *p2++);
// copy 15 times.

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

И вы уверены, что эта процедура является узким местом в вашей обработке? Вы действительно ускоряете производительность своего приложения в целом, оптимизируя это? Опять же, только измерение покажет.

0 голосов
/ 22 сентября 2008

Если запись в 16 раз быстрее простого цикла, то ваш компилятор либо отстой, либо оптимизация не включена.

Краткий ответ: нет более быстрого способа, если вы не выполняете векторные операции на параллельном оборудовании.

0 голосов
/ 22 сентября 2008

Это быстрее, как одно утверждение?

matches += (array1[0] == array2[0]) + (array1[1] == array2[1]) + ...;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...