Как понять — оптимизировать код?

Парни что то я совсем запутался, объясните как понимать оптимизирован код.
Если можно дайте примеры кода и того же кода только оптимизированного.

И еще вопрос, если есть переменная в которую число больше чем 100 не записывается (допустим строка загрузки там от 0 до 100) и если сменить тип int на byte это уже считается оптимизация (Вроде как памяти будет выделено на много меньше) ?

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

И чуток не по теме: В рефакторинг кода входит и оптимизация кода или только переделывания кода для более понятного визуального восприятия ?
  • Вопрос задан
  • 1290 просмотров
Решения вопроса 1
@Tiberal
Самый просто пример оптимизации

String output = "Some text"; 
    int count = 100; 
    for(int i =0; i<count; i++) { 
    output += i; 
    } 
    return output;


против

StringBuffer output = new StringBuffer(110); 
    output.append("Some text"); 
    for(int i =0; i<count; i++) { 
        output.append(i); 
    } 
    return output.toString();


Код делает одно и тоже, но в первом случае при вызове output += i будет каждый раз создаваться новая строка, во втором мы используем один объект. Таким образом в первом случае в памяти будет болтаться 101 строка во втором случае один объект из которого мы можем вытащить строку.
Ответ написан
Пригласить эксперта
Ответы на вопрос 4
@IceJOKER
Web/Android developer
angrySCV
@angrySCV
machine learning, programming, startuping
byte в java также компилируется в int, тоесть изменение типа данных абсолютно ничего не меняет.
да и вобще оптимизацию обычно делают в подходах, в концепциях, в классах алгоритмов, а смена типа данных это не оптимизация - это ананизм.
Ответ написан
Комментировать
angry_cellophane
@angry_cellophane
Обычно, под оптимизацией понимают:
1. Ускорение выполнения программы.
2. Уменьшение используемой памяти.

Пример: для работы с xml в джава модно использовать JAXP и SAX парсеры. SAX - однопроходный парсер, который не грузит xml файлы целиком в память, а предлагает использовать что-то вроде колбэков по определенным событиям (события: начало тэга, конец тэга, и т.д.). Таким образом он экономит память, но если нужно выполнить работу с DOM структурой xml файла, то sax парсеру придется проходить по документу несколько раз, что увеличивает время работы. По этой причине есть JAXP парсер, который сначала парсит xml документ целиком, строит для него DOM, но требует гораздо больше памяти, зато время работы существенно уменьшается. Как видно, оптимизация использования памяти/времени работы взаимосвязаны, потому перед оптимизацией стоит как можно больше узнать про нефункциональные требования к программе (Non functional requirements - NFRs), чтобы оптимизируя одно, не сломать другое.

Рефакторинг не подразумевает оптимизацию. Рефакторинг - , в первую очередь, это улучшение читабельности, поддерживаемости и расширяемости кода. Сферический пример в вакууме: вначале проекта решили напрямую инстанцировать объекты класса Bird, затем пришло осознание, что лучше использовать фабричный метод, т.к. для кое-где для тестов нужно использовать Dummy объекты. Затем решили перейти к фабрикам, потому что теперь наша система должна различать Duck и Goose. С нефункциональными требованиями эти изменения не связаны.
Ответ написан
Комментировать
A1ejandro
@A1ejandro
youtube блогер, ИТ-специалист
Одну и ту же задачу дали профи и школьнику. Каждый написал решение (свой код). Решение школьника состоит из 1000 строк кода, программа работает 1 час и дает правильный результат.
Решение профи состоит из 250 строк кода, программа работает 1 минуту и тоже дает правильный результат. Какой из кодов оптимальный (оптимизированный), а какой нет?
Ответ написан
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы