Оптимизация с профайлами имеет некоторые оговорки, один из которых упоминается даже в связанной статье Wiki. Реализованы результаты
- для данных образцов, представляющих, как ваш код фактически используется пользователем или другим кодом.
- для данной платформы (процессор, память + другое оборудование, ОС, что угодно).
С точки зрения производительности существуют довольно большие различия даже среди платформ, которые обычно считаются (более или менее) одинаковыми (например, сравнение одного ядра, старого Athlon с 512 М с 6-ядерным процессором Intel с 8G, работающим на Linux, но с очень разными версиями ядра).
- для данной JVM и ее конфигурации.
Если какое-либо из этих изменений изменилось, то ваши профилирующие результаты (и их оптимизация на основе их) больше не нужны. Скорее всего, некоторые из оптимизаций будут по-прежнему иметь положительный эффект, но некоторые из них могут оказаться неоптимальными (или даже ухудшающими производительность).
Как уже упоминалось, JIT JVM делают что-то очень похожее на профилирование, но они делают это на лету. Он также называется «hotspot», поскольку он постоянно контролирует исполняемый код, ищет горячие точки, которые выполняются часто, и будет пытаться оптимизировать только те части. На этом этапе он сможет использовать больше знаний о коде (зная его контекст, как он используется другими классами и т. Д.), Так что, как упомянуто вами и другими ответами, он может улучшить оптимизацию как статический. Он продолжит мониторинг, и если он понадобится, он сделает еще один поворот оптимизации позже, на этот раз пытаясь еще усерднее (ищет более дорогие оптимизации).
Работа с данными реальной жизни (статистика использования + платформа + конфигурация) позволяет избежать описанных выше предостережений.
Цена на это некоторое дополнительное время, которое необходимо потратить на «профилирование» + JIT-ing. Большую часть времени он проводил довольно хорошо.
Я предполагаю, что профиль наведением оптимизатор все еще может конкурировать с ним (или даже бить его), но только в некоторых особых случаях, если вы можете избежать предостережений:
- вы совершенно уверены, что ваши образцы хорошо представляют сценарий реальной жизни, и они не будут слишком сильно меняться во время исполнения.
- Вы точно знаете свою целевую платформу и можете выполнять профилирование на ней.
- и, конечно же, вы знаете/управляете JVM и его конфигурацией.
Это произойдет редко, и я думаю, что в целом JIT даст вам лучшие результаты, но у меня нет никаких доказательств.
Еще одна возможность получить выгоду от оптимизации с помощью профиля, если вы нацеливаете JVM, которая не может оптимизировать JIT (я думаю, что у большинства небольших устройств есть такая JVM).
К сожалению, одного недостатка, упомянутого в других ответах, было бы очень легко избежать: если статическая/оптимизированная по профилю оптимизация медленна (что, вероятно, так и происходит), то делайте это только для релизов (или RCs, идущих к тестерам) или во время ночных сборок (где время не так важно).
Я думаю, что гораздо большая проблема заключалась бы в том, чтобы иметь хорошие примеры тестов. Создание и поддержание их обычно непросто и занимает много времени. Особенно, если вы хотите, чтобы их можно было выполнить автоматически, что в этом случае было бы очень важно.
Согласен. Обратите внимание, что некоторые AOT-компиляторы (gcc - единственный, о котором я знаю, но могут быть и другие) имеют эту функцию и называем ее «оптимизацией времени соединения». Это относительно новое, хотя и все еще связано с угадыванием, какая функция будет вызываться чаще всего. Хотя в этом есть «оптимизация с учетом профиля», о которой упомянул ОП. – delnan