Эта история посвящена производительности кода, мы можем увидеть, как мы пишем код традиционным способом или когда у нас в голове короткий дедлайн, и как оптимизировать этот код, чтобы он работал быстро и был более читабельным для других разработчиков.
«Любой дурак может написать код, понятный компьютеру. Хорошие программисты пишут код, понятный людям »- Мартин Фаулер
Замечательно. Но вы сказали: «оптимизируйте этот код», поэтому мой вопрос: «что такое оптимизация кода?»
Оптимизация кода
Оптимизация кода - это любой метод модификации кода для повышения качества и эффективности кода. Программу можно оптимизировать, чтобы она стала меньше по размеру, потребляла меньше памяти и выполнялась быстрее.
Я считаю, что мы довольно хорошо понимаем оптимизацию кода, верно? Ага!
Давайте возьмемся за задачу и приступим к ее решению: «Напишите функцию, чтобы определить, является ли строка палиндромом или нет?»
Палиндромы
Палиндром - это слово, число, фраза или другие последовательности символов, которые читаются назад и вперед, например мадам, гоночная машина.
Приступим к кодированию!
Ну, я кодирую на 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% быстрее в лучшем случае.
Это потрясающе!
Заключение.
В этой истории мы узнали, что такое оптимизация кода, как оптимизировать код и сделать его более читаемым для других.
Мы придумали решение для данной проблемы, затем оптимизировали это решение, наконец, придумали алгоритм для максимальной скорости, этот алгоритм еще больше улучшил качество нашего кода, производительность и читаемость.