Тесты strspn:
- Стандартная реализация: .850.870
- Тестовая реализация на С(пример кода в glibc): 1.886.713
- С удаленной переменной количество пропущенный символов: 1.757.733
- Использование множества для проверки разрешенных символов: 1.651.749
- С добавлением фильтрации на бинарный максимум и минимум: 2.983.546
Тесты strcspn:
- Стандартная реализация: 1.388.789
- Тестовая реализация на С(пример кода в glibc): 10.329.430
- Удаление вызова функции поиска символа в строке: 2.444.628
- С удаленной переменной количество пропущенный символов: 2.222.662
- Использование множества для проверки разрешенных символов: 1.607.756
- Использование множества для проверки разрешенных символов(с начальным сохранением разыменованного указателя): 1.654.748
- Использование множества для проверки разрешенных символов с фильтрацией на бинарный максимум и минимум: 1.872.716
- Использование множества для проверки разрешенных символов с фильтрацией на бинарный максимум и минимум(с начальным сохранением разыменованного указателя): 1.720.738
По результатам видно что добавление фильтра ничего не дает кроме 6% замедления по сравнению с обычной версией с использованием множества. То есть 2 операции косвенной адресации с последующим сравнением работают быстрее чем 1 операция косвенной адресации с бинарной операцией и сравнением результата.
Есть предположение что это следствие особенностей архитектуры:
Есть предположение что это следствие особенностей архитектуры:
- оптимизации в Суперскалярной архитектуре(данные уже подгружены в кеш результатов);
- быстрой работе с кешем (различия в косвенной адресации и обращении к регистру минимальны);
- компилятор не разместил фильтр в регистре процессора и как результат получили вместо одного косвенного обращения два как и при работе с множеством(отличия для тестов с использованием разыменованного указателя).
В общем нужно пробовать оптимизировать ассемблерный код для исключения возможности косвенной адресации к фильтрам. Или придумать другие тесты....
P.S. Время указано в миллисекундах для Intel(R) Pentium(R) 4 CPU 3.00GHz(32 бита) и исходники тестов можно посмотреть c/strspn.
P.S. Время указано в миллисекундах для Intel(R) Pentium(R) 4 CPU 3.00GHz(32 бита) и исходники тестов можно посмотреть c/strspn.
No comments:
Post a Comment