Найти тему
IT для гуманитариев

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

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

По факту же (особенно, когда имеешь дело с не сложными задачами), часто всё оказывается гораздо проще - и для того, чтобы писать эффективный код, новичку достаточно использовать здравый смысл. Часто сталкиваюсь с тем, что информация, полученная в ВУЗе (или из других источников) живёт у человека в голове как-то отдельно от практики, абстрактно, и при решении задач человек не вспоминает о ней.

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

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

Приведу пример такого необдуманного кода от джуниор-разработчика. Задача была - прочитать построчно большой файл и каждую строку обработать определенным образом. Человек написал код, который выполнял эту задачу, но максимально медленно и неэффективно. В файле было 500 тысяч строк. Разрабочик написал цикл, который выполнялся 500 тысяч раз. В ходе каждой итерации вызывался метод read() (прочитать весь файл в память). То есть, огромный файл был открыт, закрыт и прочитан 500 тысяч раз, а не 1 раз. Во время каждой итерации вызывался метод skip(), чтобы пропустить нужное количество обработанных ранее строк - на первой итерации 0, дальше 1, потом 2 и так далее. То есть метод skip был вызван так же 500 тысяч раз.

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

Еще одно правило жизни от КО: знания даны не просто так, получая их, задумывайтесь, где их нужно будет применять.

Другой пример от этого же разработчика: в реляционной БД есть таблица с индентификатором id. По этому полю построен индекс, что позволяет, зная id, находить нужную запись в БД мгновенно. Про индексы и их роль в БД разработчик знал из университетсткого курса, но пока не понял, как это знание использовать на практике. В общем, получился у него SQL, который работал очень медленно, и когда я посмотрела, в чем там проблема, оказалось, что разработчик конвертировал id (число) - в строку, и использовал эту строку в запросе. Но вот беда, индекс-то построен по числовому полю, а со строкой работать не умеет. Поэтому теперь, чтобы найти запись с id «5» - базе данных нужно было прочитать все записи в таблице (например, их там миллионы), конвертировать каждый id (из миллионов) в строку - и сравнить его с искомым. Сколько времени потребуется на это базе данных зависит в основном от её размера.

Так что если ваш код работает очень медленно, скорее всего, причина лежит где-то на поверхности.

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