Каковы некоторые ресурсы, которые я могу использовать для изучения профилирования/оптимизации?

Вы почти у цели, но вы указали неправильный шаблон, замените "dd-mm-yyyy" на этот "dd-MM-yyyy" документы для шаблонов

Простой пример [1110 ]

System.out.println(LocalDate.now().format(DateTimeFormatter.ofPattern("dd-MM-yyyy")));   //16-01-2019

Из Joda DateTimeFormatter joda-docs

Синтаксис шаблона в основном совместим с java.text.SimpleDateFormat [119 ]

7
задан Benjamin 2 November 2013 в 18:35
поделиться

11 ответов

Существует два шага к оптимизации кода.

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

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

Обратите внимание, что профилировщик ни необходим, ни, обязательно, лучший подход. Удивительно простой, но эффективный, подход должен просто запустить программу в отладчике, и, в несколько квазислучайных раз, выполнения паузы и посмотреть на стек вызовов. Сделайте это просто пару раз, и у Вас есть очень хорошая идея того, где Ваше время выполнения проводится. @Mike Dunlavey, который прокомментировал в соответствии с этим ответом, описал этот подход подробно в другом месте.

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

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

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

Рано или поздно Вам, вероятно, придется погрузиться в большее количество оптимизации низкого уровня. Это - хитрая территория все же. Сегодняшние компьютеры довольно сложны, и производительность, которую Вы получаете от них, не проста. Стоимость ответвления или вызова функции может значительно различаться в зависимости от контекста. Добавление двух чисел вместе может взять где угодно от 0 до 100 тактов в зависимости от того, были ли оба значения уже в регистрах ЦП, что еще выполняется в то время, и много других факторов. Таким образом, оптимизация на этом уровне требует (1) хорошего понимания того, как ЦП работает и (2) партий экспериментирования и измерений. Можно легко внести изменение, что Вы думаете, будет быстрее, но необходимо быть уверены, поэтому измерить уровень прежде и после изменения.

Существует несколько общих эмпирических правил, которые могут часто помогать вести оптимизацию:

Ввод-вывод является дорогим. Инструкции ЦП измеряются в частях наносекунды. Доступ RAM находится в порядке десятков к сотням наносекунд. Доступ жесткого диска может взять десятки миллисекунд. Так часто ввод-вывод будет тем, что замедляет Ваше приложение. Ваше приложение работает, немного больших чтений ввода-вывода (считайте файл 20 МБ в одном большом блоке) или бесчисленных маленьких (байты чтения 2 052 - 2 073 из одного файла, затем считайте несколько байтов из другого файла)? Меньше больших чтений может ускорить Ваш ввод-вывод фактором нескольких тысяч.

Отсутствия страницы включают доступы жесткого диска также. Страницы в оперативной памяти должны быть продвинуты к файлу подкачки, и разбитые на страницы должны быть считаны назад в память. Если это происходит много, это будет медленным. можно ли улучшить местность данных, таким образом, меньше страниц будет необходимо одновременно? Можно ли просто купить больше RAM для главного компьютера, чтобы избежать необходимости разбивать на страницы данные? (Как правило аппаратные средства являются дешевыми. Обновление компьютера является совершенно допустимой оптимизацией - но удостоверьтесь, что обновление будет иметь значение. Чтение с диска не будет намного быстрее путем покупки более быстрого компьютера. И если все вписывается в RAM в Вашей старой системе, нет никакого смысла в покупке той с в 8 раз больше RAM),

Ваша база данных полагается на доступы жесткого диска также. Таким образом, можно ли сойти с рук кэширование большего количества данных в RAM и только иногда выписывания это к базе данных? (Конечно, там существует риск. Что происходит если сбои приложения?

И затем существуют все фаворит, распараллеливая. Современный ЦП имеет где угодно от 2 до 16 доступных ядер процессора. Вы используете их всех? Вы извлекли бы выгоду из использования их? Есть ли продолжительные операции, которые могут быть выполнены асинхронно? Приложение запускает операцию в отдельном потоке и затем может возобновить нормальное функционирование немедленно, вместо того, чтобы блокироваться, пока операция не завершена.

Так в основном используйте профилировщика для понимания приложения. Как это проводит свое время выполнения, где это потратило? Действительно ли потребление памяти является проблемой? Каковы шаблоны ввода-вывода (и жесткий диск и доступы к сети, а также какой-либо другой вид ввода-вывода)? ЦП просто крутится далеко все время или является этим неактивное ожидание некоторых внешних событий, таких как ввод-вывод или таймеры?

И затем поймите как можно больше о компьютере, на котором это работает. Поймите, какие ресурсы это имеет в наличии (кэш ЦП, несколько ядер), и что каждый из них имеет в виду для производительности.

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

14
ответ дан 6 December 2019 в 06:25
поделиться

Я беру студенческий курс (одной темой является Анализ Производительности), и рекомендуемый текст является Искусством Анализа Производительности Компьютерных систем: Методы для Экспериментального плана, Измерения, Моделирования и Моделирования. Это - что-то вроде библии на предмете и могло бы быть небольшим излишеством.

4
ответ дан 6 December 2019 в 06:25
поделиться

Если Вы знакомы с и уже купили МУРАВЬЕВ (очень прекрасный профилировщик) затем идут сюда, чтобы быстрое учебное руководство разбудило Вас и выполнение.

3
ответ дан 6 December 2019 в 06:25
поделиться

Если у Вас есть Система Команды Visual Studio, я предлагаю использовать Профилировщика, которого она содержит.
Это находится под, "Анализируют-> Профилировщик"
Используя этого профилировщика действительно просто. Можно просто погрузиться в и видеть то, что Вы делаете из него. Руки на практику лучше, чем какая-либо статья или книга, которую Вы собираетесь прочитать об этом.

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

2
ответ дан 6 December 2019 в 06:25
поделиться

Существуют профилировщики и аналитические инструменты производительности, но в то время как Вы пытаетесь найти / покупают / установка / изучает один, просто пробует прием старика...

Запустите приложение под IDE, и в то время как это вяло, нажало кнопку "Pause" и спрашивает это, что это делает, и почему. Лучший способ ответить на это путем чтения стека вызовов.

Если это несколько раз медленнее, чем это должно быть, как 10 раз, который означает, что это тратит 90% своего времени, делая что-то ненужное, и это - вероятность, Вы поймаете его делающий его. При повторении этого несколько раз можно подтвердить подозрения с такой точностью, как Вы хотите.

Таким образом, Вам не нужно дорогое / популярная но нечеткая лупа.

Так нахождение причины замедления не является твердой частью, и обычно существуют несколько.

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

Удачи.

1
ответ дан 6 December 2019 в 06:25
поделиться

Блог Read Rico Mariani. Прежде чем он был продвинут, он был крупным настраивающим парнем производительности для .NET. Более старые записи в его блоге имеют тонну хорошего совета. Я запустил бы близко к началу и проложил бы себе путь вперед.

Это, плюс статьи, которые Вы уже нашли (особенно первая) должно запустить Вас.

1
ответ дан 6 December 2019 в 06:25
поделиться

Я использовал профилировщиков прежде, они могут быть полезными, но можно получить много справки только от создания одноэлементного класса типа секундомера, и "Щелчок" это (имейте его, распечатывают время начиная с последнего щелчка и что было просто сделано, который занял время), прежде и после методов, Вы думаете, могло бы быть проблематичным.

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

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

Ищите случаи, где Вы делаете долгие операции на основе нажатий клавиш. Они должны почти всегда делаться вне основного потока.

Даже не ДУМАЙТЕ об оптимизации вещей как числа классов или как часто они инстанцируют, конкатенация строк (за пределами циклов), аннулируя переменные или любую из других глупых стратегий, которые кажутся, что они должны помочь. Я попробовал некоторых и всегда заканчивал тем, что чувствовал себя глупым, когда я на самом деле замедлил вещи, потому что я не был так умен, как время выполнения в большинстве вещей.

1
ответ дан 6 December 2019 в 06:25
поделиться

Я загрузил бы несколько профильных инструментов, доступных (бесплатные демонстрационные версии), и начал бы использовать их.

Я использовал jetbrains, и существуют другие. (муравьи, например, devpartner и MS один?, atomatedqa, и т.д.), у Вас не должно быть слишком больших проблем при выполнении их. У них есть отчеты, которые дают Вам большую информацию, и можно изучить довольно быстро просто использование приложений.

Любой из них, вероятно, поможет Вам, и хорошо использовать пробные версии. Можно затем или просто отложить решение купить инструмент или купить один (s), который был самым полезным/самым легким для использования. В целом они - средства сохранения прекрасного времени и стоящий денег, хотя некоторые могут быть дорогими. (Мне приходится нелегко с теми на верхнем конце, когда существуют очень хорошие инструменты для намного меньшего количества денег),

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

удачи.

просто загрузите некоторые инструменты и начните запускать свое приложение.

Править:

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

как пример: Я думаю, что Joel записал статью обратно путь о, он сделал что-то как

для (интервал i = 0; я <strlen (некоторая строка); я ++)

это довольно очевидно, что Вы собираетесь назвать strlen (дорогим) каждое повторение цикла.

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

1
ответ дан 6 December 2019 в 06:25
поделиться

Это не поможет Вам очень на C#, но инструменты OS X Shark (идет с инструментами разработчика от Apple), Лучшие профильные инструменты, через которые я приехал. Почти забава использовать!

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

Во-вторых, необходимо иметь размеры (который кажется, что Вы собираетесь сделать). Я был, вводят в заблуждение моим инстинктом пищеварительного тракта почти всегда; места, которые я рассматривал бы как вторичные, являются берущими времени. Это также означает, когда Вы оптимизируете, Вы всегда оптимизируете для определенного набора тестовых сценариев, которые Вы выполняете. Выбор таких случаев важен.

0
ответ дан 6 December 2019 в 06:25
поделиться
1
ответ дан 6 December 2019 в 06:25
поделиться

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

То, что Вы делаете с выводом, является находкой методы, которые берут большую часть time.l, Это не все, но Вы попросили хороший способ изучить, как оптимизировать код, таким образом, длительные стандартные программы являются хорошим местом для запуска. МУРАВЬИ, которых Вы упомянули, примут значение по умолчанию к проявлению длительных стандартных программ, как будет больше всего, если не все, другие.

Можно исключить методы контейнера, как Основной (), если у Вас нет большого количества кода там (вряд ли).

В целом я нахожу большинство отходов в трех областях:

  1. Циклы
  2. Рекурсия
  3. Сетевая задержка

Область № 3, для базы данных, обычно легко определить, если Вы также представите свою базу данных, поскольку Вы будете видеть количество хитов. Лучший способ уменьшить сетевую задержку, или базу данных или не (служебные вызовы, например), должен связаться в сообщениях, а не CRUD. Не запрашивайте каждую таблицу по одному. К сожалению, решение часто требует частей консервирования многих слоев общих данных.

Рекурсия и циклы являются очень похожими проблемами. Если Вы хотите удар для маркера, поражаете внутренний цикл сначала.

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

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

0
ответ дан 6 December 2019 в 06:25
поделиться
Другие вопросы по тегам:

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