Детали оптимизации кода
1. Попробуйте указать, что окончательный модификатор класса и метода. Занятия с окончательными модификаторами с окончательными модификаторами не могут быть получены. В Java Core API есть много примеров применения финала, таких как java.lang.string, и весь класс является окончательным. Указание окончательного модификатора для класса может предотвратить унаследование класса, и указание окончательного модификатора для метода может предотвратить переопределение метода. Если класс указан как окончательный, все методы этого класса являются окончательными. Компилятор Java будет искать возможности для внедрения всех окончательных методов. Inline имеет большое значение для повышения эффективности работы Java.
2. Попробуйте повторно использовать использование объектов, особенно строковых объектов. Когда происходит string uncatenation, вместо этого следует использовать StringBuilder/StringBuffer. Поскольку виртуальные машины Java не только должны тратить время на создание объектов, им также может потребоваться потратить время на сбор и обработку мусора в будущем, генерируя слишком много объектов окажет большое влияние на производительность программы.
3. Используйте локальные переменные, чтобы называть методы как можно больше. Параметры, прошедшие при вызове методов, и временные переменные, созданные в вызове, хранятся в стеке быстрее. Другие переменные, такие как статические переменные, переменные экземпляра и т. Д., Созданы в куче, а скорость медленнее. Кроме того, поскольку переменные, созданные в стеке, закончено, это содержимое исчезло, и дополнительная сборы мусора не требуется.
4. Закройте поток во времени
Во время программирования Java будьте осторожны при выполнении подключения к базе данных и потоковой передачи ввода -вывода. После использования закройте его вовремя, чтобы выпустить ресурсы. Поскольку работа этих больших объектов вызовет накладные расходы на большие системы, и если вы не будете осторожны, это приведет к серьезным последствиям.
5. Постарайтесь минимизировать повторный расчет переменных, проясните концепцию. Даже если в методе есть только одно предложение, оно все еще потребляется, включая создание кадров стека, защита сайта при вызове метода и восстановление сайта при вызове метода. Так, например, следующая операция:
for (inti = 0; i <list.size (); i ++)
{...} рекомендуется заменить его:
for (inti = 0, length = list.size (); i <length; i ++)
{...}
Таким образом, когда List.Size () очень большой, он уменьшает много потребления
6. Попробуйте принять ленивую стратегию загрузки, то есть создать ее, когда это необходимо
7. Использование аномалий с осторожностью будет наносит ущерб производительности. Чтобы сделать исключение, вы должны сначала создать новый объект. Конструктор брошенного интерфейса вызывает локальный метод синхронизации с именем filinstacktrace (). Метод FillinStackTrace () проверяет стек и собирает информацию о трассировке вызовов. Пока исключение брошено, виртуальная машина Java должна настроить стек вызовов, потому что при обработке создается новый объект. Исключения могут использоваться только для обработки ошибок и не должны использоваться для управления потоком программ.
8. Не используйте попробуйте ... поймать ... в петле, его следует помещать на самый внешний слой
Согласно мнениям, выдвинутым пользователями пользователей сети, я думаю, что это стоит обсудить
9. Если вы можете оценить продолжительность добавления контента, укажите начальную длину для классов сбора и инструментов, реализованных в массиве, таких как ArrayList, Linkedllist, StringBuilder, StringBuffer, Hashmap, Hashset и т. Д. Возьмите StringBuilder в качестве примера:
(1) stringBuilder () // По умолчанию распределить 16 символов (2) StringBuilder (int size) // По умолчанию выделить 16 символов (3) StringBuilder (String Str) // По умолчанию, чтобы выделить 16 символов + str.length () пространство символов, вы можете установить его способность инициализации через конструктор класса (мы здесь не обращаемся только к строкости выше), который может значительно улучшить производительность. Например, StringBuilder, длина представляет количество символов, которые может сохранить текущий StringBuilder. Поскольку, когда StringBuilder достигнет своей максимальной емкости, он увеличит свою емкость до 2 раза и добавит 2. Когда StringBuilder достигнет своей максимальной емкости, ему придется создать новую массив символов и скопировать старый содержимое массива символов в новую массив символов - это очень операция по производству производительности. Представьте себе, что если вы можете оценить, что 5000 символов хранятся в массиве символов без указания длины, мощность 2 ближайших к 5000 составляет 4096, а 2, добавленные к каждому расширению, независимо от 2, тогда::
(1) На основании 4096, подайте заявку на массивы символов размером 8194, которые сразу же составляют до 12290 массивов. Если вы можете указать массивы символов размером 5000 в начале, он сохранит более чем в два раза больше пространства (2) скопировать исходные символы 4096 в новую массив символов таким образом, что не только тратит пространство памяти, но и снижает эффективность работы кода. Следовательно, не ошибочно устанавливать разумную инициализацию для сбора и классов инструментов, реализованных в базовом массиве, что принесет немедленные результаты. Тем не менее, обратите внимание, что коллекции, такие как HashMap, которые реализованы в массивах + связанных списках, не должны устанавливать начальный размер, так же, как ваш оценочный размер, потому что возможность только одного объекта, подключенного к таблице, почти 0. Рекомендуется установить начальный размер на n мощности 2. Если вы можете оценить, что есть 2000 элементов, установить его на новый Hashmap (128) и New Hashmap (256).
10. При копировании большого количества данных используйте команду System.ArrayCopy ()
11. Умножение и разделение использования операций смены
12. Не постоянно создавайте ссылки на объекты в цикле
Например:
for (inti = 1; i <= count; i ++) {Object obj = newObject (); }Этот подход приведет к тому, что ссылка объекта графа существует в памяти. Если счет большой, он будет потреблять память. Рекомендуется изменить его на:
Объект obj = null; for (inti = 0; i <= count; i ++) {obj = newobject ();} Таким образом, в памяти есть только одна ссылка на объект объекта. Каждый раз, когда используется New Object (), ссылка объекта объекта указывает на другой объект, но в памяти есть только один объект, который значительно сохраняет пространство памяти.
13. Основываясь на рассмотрении эффективности и проверки типов, массив следует использовать как можно больше. ArrayList должен использоваться только тогда, когда размер массива не может быть определен.
14. Попробуйте использовать HashMap, ArrayList и StringBuilder. Если нить не требует этого, это не рекомендуется использовать хэштибл, вектор и StringBuffer. Последние три имеют накладные расходы из -за использования механизмов синхронизации.
15. Не объявляйте массивы общественным статическим финалом
Поскольку это бессмысленно, это только определяет ссылку как статический финал, а содержание массива все еще может быть изменено по желанию. Объявление массива публикой является уязвимостью безопасности, что означает, что массив может быть изменен внешними классами
16. Постарайтесь использовать синглтонов в подходящих случаях. Использование синглтонов может снизить нагрузку, сократить время нагрузки и повысить эффективность нагрузки. Однако не все места подходят для синглтонов. Проще говоря, синглтоны в основном применимы к следующим трем аспектам:
(1) Управляйте использованием ресурсов, управляйте одновременным доступом к ресурсам посредством синхронизации потоков (2) контролировать генерацию экземпляров для достижения цели сохранения ресурсов (3) контролировать обмен данными и обеспечить связь между несколькими не связанными процессами или потоками без установления прямых ассоциаций без установления прямых ассоциаций.
17. Старайтесь не использовать статические переменные по желанию
открытый класс A {Private Static B B = newB (); } В настоящее время жизненный цикл статической переменной B такой же, как и у класса A. Если класс A не удален, объект B, указанный по ссылке B
18. Ясно, что больше не нужны сессии во времени. Чтобы очистить больше не активных сеансов, многие серверы приложений имеют тайм -аут сеанса по умолчанию, как правило, 30 минут. Когда сервер приложений должен сохранить больше сеансов, если не хватает памяти, операционная система передаст часть данных на диск. Сервер приложений может также сбросить некоторые неактивные сеансы на диск в соответствии с алгоритмом MRU (чаще всего используется недавно) и может даже бросить недостаточные исключения для памяти. Если сеанс должен быть сброшен на диск, он должен быть сериализован в первую очередь. В крупномасштабных кластерах сериализация объектов стоит дорого. Следовательно, когда сеанс больше не требуется, метод httpsession Invalidate () должен быть вызван во времени, чтобы очистить сеанс.
19. Для коллекций, которые реализуют интерфейсы случайного возраста, такие как ArrayList, вы должны использовать наиболее распространенное для цикла вместо цикла Foreach, чтобы пройти это JDK для пользователей. Объяснение JDK API интерфейса случайного интерфейса: реализация интерфейса RandomAccess используется, чтобы указать, что он поддерживает быстрый случайный доступ. Основная цель этого интерфейса состоит в том, чтобы позволить общим алгоритмам изменять свое поведение, чтобы он мог обеспечить хорошую производительность при применении к случайным или непрерывным спискам доступа. Практический опыт показывает, что если экземпляры класса, которые реализуют интерфейс случайного, доступны случайным образом, эффективность использования обычных для петли будет выше, чем у использования петлей Foreach; И наоборот, если он доступен последовательно, будет более эффективно использовать итератор. Вы можете использовать коды, аналогичные следующим, для вынесения суждений:
if (list ancessionofrandomaccess) {for (inti = 0; i <list.size (); i ++) {}} else {iterator <?> iterator = list.iterable (); while (iterator.hasnext ()) {iterator.next ()}} Принцип базовой реализации цикла Foreach является итератором, поэтому вторая половина предложения «по очереди, если к нему доступ к последовательному обращению, использование итератора будет более эффективной» означает, что экземпляры класса, к которым доступны доступ, и используют петлю Foreach для Traverse.
20. Использование синхронизированных кодовых блоков вместо методов синхронизации было очень четко объяснено в статье метода синхронизированного метода блокировки в многопоточном модуле. Если нельзя определить, что весь метод должен быть синхронизирован, постарайтесь использовать синхронизированные кодовые блоки, чтобы избежать синхронизации тех кодов, которые не должны синхронизировать, что влияет на эффективность выполнения кода.
21. Объявите константы статическими окончательными и назовите их в капитале, чтобы это содержимое было помещено в постоянный пул во время компиляции, избегая расчета генерируемых постоянных значений во время выполнения. Кроме того, название имени константы в капитале также может способствовать различию между констант и переменными
22. Не создавайте некоторые неиспользованные объекты, не импортируйте некоторые неиспользованные классы
Это не имеет смысла. Если «значение локальной переменной I не используется» и «Import Java.Util никогда не используется» в коде, пожалуйста, удалите это бесполезное содержимое
23. Избегайте использования отражения во время работы программы. Для получения дополнительной информации см. Размышления. Отражение - это очень мощная функция, предоставленная Java пользователям. Мощные функции часто означают низкую эффективность. Не рекомендуется использовать механизм отражения в процессе запуска программы, особенно метод метода. Если это действительно необходимо, наводящий на мысль о создании объекта посредством отражения и вставлена в память, когда проект запускается - пользователь заботится только о самой быстрой скорости отклика при взаимодействии со сверстником, и ему все равно, сколько времени требуется для начала проекта сверстника.
24. Используйте пул соединений базы данных и пул потоков, оба пула, используются для повторного использования объектов. Первый может избежать частых открытия и закрытия соединений, а последний может избежать частого создания и разрушения нитей.
25. Используйте буферизованные входные и выходные потоки для операций ввода -вывода
Буферированные входные и выходные потоки, а именно буфериальная читатель, буферист, буферизаторноптуст, BufferedOutputStream, который может значительно повысить эффективность ввода -вывода
26. Используйте ArrayList для сцен с более последовательной вставкой и случайным доступом, и используйте LinkedList для сцен с большей удалением элементов и промежуточной вставкой.
Это известно, понимая принципы ArrayList и LinkedList
27. Не позволяйте слишком много формальных параметров в публичном методе
Общественный метод - это метод, предоставляемый внешнему миру. Если вы дадите эти методы слишком много формальных параметров, есть два основных недостатка:
1) нарушение объектно-ориентированной идеи программирования. Java подчеркивает, что все является объектом. Слишком много формальных параметров не соответствуют объектно-ориентированной идее программирования.
2) Слишком много параметров неизбежно приведет к увеличению вероятности ошибки в вызове метода. Что касается того, на сколько «слишком много» относится, 3 или 4. В студенческую таблицу есть 10 полей информации студентов. Эти 10 параметров могут быть инкапсулированы в класс сущности в качестве формальных параметров метода вставки.
28. При написании строковых переменных и констант строки равны, это относительно распространенный трюк - писать строковые константы впереди. Если есть следующий код:
String str = "123"; if (str.equals ("123")) {...} Рекомендуется изменить его на:
String str = "123"; if ("123" .equals (str)) {...} Это может в основном избежать исключений нулевого указателя
32. Не заставляйте преобразование вниз основных типов данных за пределами области
33. Преобразовать основной тип данных в строку. Основной тип данных.toString () - это самый быстрый способ, за которым следует string.valueof (data) и Data + «Самый медленный способ преобразования основного типа данных в три способа. У меня есть данные ISTEGER Type I, которые могут использовать I.ToString (), String.valueOf (i), i +». Насколько эффективны три метода?
publicstatic void main (string [] args) {intlooptime = 50000; Целое число I = 0; longStartTime = System.CurrentTimeMiLlis (); for (intj = 0; j <looptime; j ++) {string str = string.valueof (i); } System.out.println ("string.valueof ():" + (system.currenttimemillis () - starttime) + "ms"); startTime = System.CurrentTimeMillis (); for (intj = 0; j <looptime; j ++) {string str = i.ToString (); } System.out.println ("integer.tostring ():" + (system.currenttimemillis () - starttime) + "ms"); startTime = System.CurrentTimeMillis (); for (intj = 0; j <looptime; j ++) {string str = i+""; } System.out.println ("i + /" /":" + (System.currentTimeMillis () - startTime) + "ms");}Результат работы:
String.valueof (): 11msInteger.toString (): 5 мс + "": 25 мс
Поэтому, когда вы преобразуете основной тип данных в строку в будущем, вы должны уделять приоритет использования метода ToString (). Что касается почему, это очень просто:
1. Метод string.valueof () называется методом integer.tostring () внизу, но перед вызовом он вынесет краткий суд.
2. Я не буду говорить о методе integer.tostring (), я буду называть его напрямую.
3. нижний слой i + "" использует StringBuilder для его реализации. Сначала используйте метод добавления, чтобы сплачивать его, а затем использовать метод ToString (), чтобы получить строку. Это, очевидно, самый быстрый 2, самый быстрый 1 и самый медленный 3.
Выше всего содержание этой статьи. Я надеюсь, что это будет полезно для каждого обучения, и я надеюсь, что все будут поддерживать Wulin.com больше.