Тестирование палиндрома часть 4

Тестирование палиндрома - часть 4

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

Сегодня мы увидим, как мы можем упростить нашу работу и на самом компьютере, чтобы мы могли добиться более короткого и четкого кода и большей скорости..

Код, который у нас есть на данный момент:

$ test = ‘Если бы у меня был Hi-Fi’;
$ упрощенный = preg_replace (‘/ \ W /’, », $ test); $ упрощенный = strtolower ($ упрощенный);
$ is_palindrome = true;
$ повторение = strlen ($ упрощенное); $ повторение = $ повторение / 2; # достаточно проверить до середины, так как предполагается, что это будет зеркало
for ($ i = 0; $ i $ повторение; $ i ++) {$ a = substr ($ упрощенный, $ i, 1); $ b = substr ($ упрощенный, — ($ i + 1), 1);
if ($ a! == $ b) {# строгая проверка работает немного быстрее $ is_palindrome = false; перерыв; # больше проверок делать не нужно — уже ясно, что это не палиндром}}
var_dump ($ is_palindrome);

Функции верхнего и нижнего регистра

Одна из вещей, которую мы можем сделать, — это удалить функцию strtolower (). Вместо этого позже в коде мы можем использовать функции, которые не зависят от прописных и строчных букв (без учета регистра).

Читать также:  Тестирование палиндрома часть 1

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

strrev () и strcasecmp ()

Сначала с помощью strrev () мы можем инвертировать всю строку, а затем с помощью strcasecmp () мы можем выполнить проверку без учета регистра между исходным текстом и его версией в обратном порядке..

Таким образом, упрощенный код будет:

$ test = ‘Если бы у меня был Hi-Fi’; $ упрощенный = preg_replace (‘/ \ W /’, », $ test); $ rev = strrev (упрощенно $); $ is_palindrome = (strcasecmp ($ упрощенный, $ rev) === 0);
var_dump ($ is_palindrome);

Не запутайтесь в синтаксисе (strcasecmp ($ упрощенный, $ rev) === 0). Крайние круглые скобки должны гарантировать, что переменная $ is_palindrome получит значение результата теста с ===.

Читать также:  WP parse_request () и do_parse_request

Левая часть этой проверки является результатом функции strcasecmp (). В качестве аргументов требуется 2 строки. Если первая строка «меньше» второй, результат будет меньше 0. Если они равны (равны), то результат будет 0. Если первая строка «больше» второй — результат будет больше чем 0.

В документации не сказано, как именно определить размер строк, но в нашем случае достаточно знать, что мы ищем результат 0. Следовательно, эта проверка при присвоении результата переменной $ is_palindrome.

Результат оптимизации

Я провел несколько тестов, и оказалось, что эта новая версия более чем в 2 раза быстрее (в тестах, в частности, с «Если бы у меня был Hi-Fi»). Основная задержка кода возникает даже из-за регулярного выражения:

$ упрощенный = preg_replace (‘/ \ W /’, », $ test);

Это означает только одно — для скорости важно знать встроенные в PHP функции. Вместо того, чтобы писать все в одиночку, мы должны использовать их.

Читать также:  Deep Linking Часть 3 Исправление для IE7

Такие встроенные функции написаны на другом уровне и являются частью самого анализатора PHP. Таким образом, у нас всегда будет лучшая производительность, чем если бы мы сели писать пользовательскую функцию.

Всякий раз, когда вам нужно сделать что-то стандартное — проверьте, нет ли уже готовой функции для этого. В худшем случае — будет 2-3 функции, которые объединяются, чтобы делать то, что вы хотите..

Если вы когда-нибудь задумывались, о чем было ваше руководство по началу работы с PHP — о текстовых функциях — теперь я надеюсь, что он стал более понятным..

И если мы хотим сделать это в виде функции, мы получим:

функция test_palindrome ($ test) {$ упрощенный = preg_replace (‘/ \ W /’, », $ test); $ rev = strrev (упрощенно $);
$ Сравнение = strcasecmp ($ упрощенный, $ Rev);
возврат (сравнение $ === 0); }
$ is_palindrome = test_palindrome (‘Если бы у меня был Hi-Fi’);
var_dump ($ is_palindrome);

Понравилась статья? Поделиться с друзьями:
Что нужно знать пользователю?