2017-02-09 14 views
1

Я хочу, чтобы наиболее быстро & эффективно обнаружил, что два буфера памяти - содержащие произвольно определенные значения - идентичны побитовому сравнению.memcmp - есть ли более быстрый способ поразрядного сравнения двух буферов

Меня не интересует ничего, кроме булева «идентична», и я хочу, чтобы метод возвращался как можно быстрее, т. Е. При обнаружении первой разности.

Каков наилучший способ достичь этого? Я currenlty первый сравнивая общий размер - который я знаю - и использовать memcmp, если они имеют одинаковый размер

memcmp(buf1_ptr, buf2_ptr, sizeof(buf1)) 

Является ли это наиболее эффективным я могу сделать? Должен ли я разделить сравнение на сокеты для цикла?

+2

Насколько велики буферы? Если они не очень большие, и вы можете получить некоторую выгоду от нескольких потоков, я сомневаюсь, что вы сделаете лучше, чем 'memcmp'. – BoBTFish

+0

@BoBTFish: Если буфер такой большой, то ограничивающий фактор, вероятно, будет иметь пропускную способность между ЦП и ОЗУ, и я ожидаю, что одно ядро ​​может, вероятно, насытить это. –

+0

@MartinBonner Это не то, что я готов спекулировать на основании представленной минимальной информации. Я сказал * возможно *. – BoBTFish

ответ

3

В целом, memcmp будет написан на ассемблере экспертами. Очень, очень маловероятно, что вы можете сделать что-то лучше, чем они, по общей проблеме, которую он решает.

Если вы указали, вы можете пообещать, что указатели всегда будут (например) выровнены по границе 16 байт и что длина всегда будет кратной 16 байтам, вы можете сделать немного лучше, используя некоторое векторное решение, подобное SSE. (memcmp wil, вероятно, в конечном итоге использует SSE в этих условиях, но сначала нужно сделать некоторые тесты, чтобы убедиться - и вы можете сэкономить стоимость этих тестов).

В противном случае - просто используйте memcmp.

+0

Спасибо. Единственное, на что я не был уверен: для больших буферов memcmp «остановится» при первой разнице или всегда будет проверять полный размер? В этом случае есть преимущество «разваливать его» в for-loop? – BmyGuest

+1

Стандарт не гарантирует, что он остановится на первом отличии (поскольку стандарт не имеет тенденций предлагать такие гарантии производительности). * На практике * все реализации будут останавливаться при первой разнице (или, возможно, вскоре после первой разницы, если разработчик считает, что сокращение количества филиалов улучшит общую производительность). –

 Смежные вопросы

  • Нет связанных вопросов^_^