Выравнивание и производительность - PullRequest
5 голосов
/ 31 января 2012

Подпрограммы strcmp для сравнения char * и memcmp для всего остального, работают ли они быстрее на блоке памяти (на x86_64), который каким-то образом выровнен (как?)?Использует ли libc SSE для этой процедуры?

Ответы [ 2 ]

5 голосов
/ 31 января 2012

Это зависит, но от архитектур, где выравнивание имеет значение или где имеются инструкции SIMD, обычно процедуры будут работать с начальными байтами, затем выполнять столько операций широкого выравнивания, сколько позволяют данные, а затем работать с конечными байтами.

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

0 голосов
/ 31 января 2012

Если вы беспокоитесь о производительности для сравнения, вам следует взглянуть на хорошо известный аллогритм Бойера-Мура и этот пост от автора GNU Grep, Майка Хертела.

Он объясняет, как можно действительно быстро искать что-то в блоке данных.

Его резюме совершенно ясно о том, что делать:

  • Используйте Бойера-Мура (и разверните его внутренний цикл несколько раз).
  • Сверните свой небуферизованный ввод с помощью необработанных системных вызовов. Избегайте копирования входные байты перед их поиском. (Однако используйте буфер выход . Обычный сценарий grep заключается в том, что маленький по сравнению с объемом ввода, поэтому накладные расходы на вывод буферное копирование невелико, а экономия за счет избежания множества мелких Небуферизованные записи могут быть большими.)
  • Не ищите новые строки во вводе, пока не найдете совпадение.
  • Попытайтесь настроить вещи (буферы с выравниванием страницы, блоки чтения размером с страницу, опционально используйте mmap), чтобы ядро ​​ТАКЖЕ могло избежать копирования байтов.
...