Monday, December 29, 2008

Производительность реализаций str(с)spn

Тесты strspn:

  1. Стандартная реализация: .850.870
  2. Тестовая реализация на С(пример кода в glibc): 1.886.713
  3. С удаленной переменной количество пропущенный символов: 1.757.733
  4. Использование множества для проверки разрешенных символов: 1.651.749
  5. С добавлением фильтрации на бинарный максимум и минимум: 2.983.546

Тесты strcspn:

  1. Стандартная реализация: 1.388.789
  2. Тестовая реализация на С(пример кода в glibc): 10.329.430
  3. Удаление вызова функции поиска символа в строке: 2.444.628
  4. С удаленной переменной количество пропущенный символов: 2.222.662
  5. Использование множества для проверки разрешенных символов: 1.607.756
  6. Использование множества для проверки разрешенных символов(с начальным сохранением разыменованного указателя): 1.654.748
  7. Использование множества для проверки разрешенных символов с фильтрацией на бинарный максимум и минимум: 1.872.716
  8. Использование множества для проверки разрешенных символов с фильтрацией на бинарный максимум и минимум(с начальным сохранением разыменованного указателя): 1.720.738
По результатам видно что добавление фильтра ничего не дает кроме 6% замедления по сравнению с обычной версией с использованием множества. То есть 2 операции косвенной адресации с последующим сравнением работают быстрее чем 1 операция косвенной адресации с бинарной операцией и сравнением результата.

Есть предположение что это следствие особенностей архитектуры:
  • оптимизации в Суперскалярной архитектуре(данные уже подгружены в кеш результатов);
  • быстрой работе с кешем (различия в косвенной адресации и обращении к регистру минимальны);
  • компилятор не разместил фильтр в регистре процессора и как результат получили вместо одного косвенного обращения два как и при работе с множеством(отличия для тестов с использованием разыменованного указателя).
В общем нужно пробовать оптимизировать ассемблерный код для исключения возможности косвенной адресации к фильтрам. Или придумать другие тесты....

P.S. Время указано в миллисекундах для Intel(R) Pentium(R) 4 CPU 3.00GHz(32 бита) и исходники тестов можно посмотреть c/strspn.

No comments: