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

«Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям »- Мартин Фаулер

Замечательно. Но вы сказали: «оптимизируйте этот код», поэтому мой вопрос: «что такое оптимизация кода?»

Оптимизация кода

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

Я считаю, что мы довольно хорошо понимаем оптимизацию кода, верно? Ага!

Давайте возьмемся за задачу и приступим к ее решению: «Напишите функцию, чтобы определить, является ли строка палиндромом или нет?»

Палиндромы

Палиндром - это слово, число, фраза или другие последовательности символов, которые читаются назад и вперед, например мадам, гоночная машина.

Приступим к кодированию!

Ну, я кодирую на JavaScript, поэтому я использую JavaScript в этом примере, но вы можете использовать любой из ваших любимых языков программирования, это полностью зависит от вас.

Что мы делаем традиционным способом.

function isPalindrome(str) {
 return str.toLowerCase() ===       str.toLowerCase().split('').reverse().join('');
};
isPalindrome('madam'); // true
isPalindrome('racecar'); // true
isPalindrome('pop'); // true
isPalindrome('something'); // false
isPalindrome('abc'); // false

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

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

Это то, что мы делаем в спешке. Попробуем это оптимизировать. 🤔

function isPalindrome(str) {
 str = str.toLowerCase();
 return str === str.split('').reverse().join('');
};

Ура, я оптимизировал приведенный выше блок кода.
Объединение двух вызовов функций 𝚝𝚘𝙻𝚘𝚠𝚎𝚛𝙲𝚊𝚜𝚎 в один, что повысило производительность нашего кода, вы можете проверить приложенные снимки экрана.

Формула производительности

Формула записана на скриншоте выше, но позвольте мне объяснить вам здесь.
Допустим, блок кода №1 выполняется за 4 мс, а блок кода №2 - за 3 мс, поэтому наша инструкция будет выглядеть так:
min_time / max_time * 100
3 / 4 * 100 = 75
100 - 75 = 25

Это означает, что кодовый блок №2 на 25% быстрее, чем кодовый блок №1.

Согласно приведенному выше результату производительности, isPalindrome1 выполняется за 0,01074 мс, а isPalindrome2 выполняется за 0,00610 мс, что означает, что isPalindrome2 на 43% быстрее.

Круто, производительность увеличилась почти на 40%, просто объединив два отдельных вызова в один, это то, о чем мы никогда не думаем при кодировании. Да, ты прав.

Пора сделать его более быстрым и читаемым. Я знаю, что фраза «split (‘ ’). Reverse (). Join (‘ ’)» немного сбивает с толку.

Давайте придумаем лучший подход для этого. 🤔

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

Позвольте мне показать вам блок-схему алгоритма, чтобы вы могли лучше его понять.

Схема.

Блок-схема - это тип диаграммы, представляющий рабочий процесс или процесс.
Блок-схема также может быть определена как схематическое представление алгоритма, пошагового подхода к решению задачи.

Давайте построим решение, используя описанный выше алгоритм, и посмотрим, каков результат.

function isPalindrome(str) {
 //converting string into lowercase
 str = str.toLowerCase();
 //divid string by 2, floor the value and saving it to count
 let count = Math.floor(str.length / 2);
 // initialize flag with default value of true 
 let flag = true;
 //loop over the count
 for(var i = 0; i < count; i++){
  //comparing string characters
  if(str[i] !== str[str.length - i - 1]){
   //set flag to false and break the loop
   flag = false;
   console.log('No palindrome found');
   break;
  }
 }

 return flag;
}

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

Хммм, хорошая идея!

isPalindrome('abc'); // false
isPalindrome('madam'); // true
isPalindrome('racecar'); // true
isPalindrome('pop'); // true
isPalindrome('something'); // false
isPalindrome('xyz'); // false

Отлично, давайте проверим производительность.

Согласно приведенному выше результату производительности, isPalindrome3 почти на 4% быстрее, чем isPalindrome2 в обоих случаях, на 43% быстрее, чем isPalindrome1 в худшем случае и почти на 55% быстрее в лучшем случае.

Это потрясающе!

Заключение.

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

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