Есть ли понятие встроенных функций в java, или его заменили что-то еще? Если есть, как он используется? Я слышал, что методы public
, static
и final
являются встроенными функциями. Можем ли мы создать собственную встроенную функцию?
Существуют ли встроенные функции в java?
Ответ 1
В Java оптимизация обычно выполняется на уровне JVM. Во время выполнения JVM выполняет некоторый "сложный" анализ, чтобы определить, какие методы встроены. Он может быть агрессивным в inlining, и JVM Hotspot на самом деле может встроить не конечные методы.
Компиляторы java почти никогда не выстраивают никакого вызова метода (JVM делает все это во время выполнения). Они выполняют встроенные константы времени компиляции (например, конечные статические примитивные значения). Но не методы.
Дополнительные ресурсы:
-
Статья: Ядро Java HotSpot Performance Engine: пример использования метода
-
Wiki: Inlining в OpenJDK, не полностью заполнен, но содержит ссылки на полезные обсуждения.
Ответ 2
Java не дает возможности вручную предложить, чтобы метод был встроен. Как отмечает @notnoop в комментариях, inlining обычно выполняется JVM во время выполнения.
Ответ 3
Нет, в java нет встроенной функции. Да, вы можете использовать общедоступный статический метод в любом месте кода при размещении в открытом классе. Компилятор java может выполнять встроенное расширение по статическому или окончательному методу, но это не гарантируется.
Обычно такие оптимизации кода выполняются компилятором в комбинации с JVM/JIT/HotSpot для часто используемых сегментов кода. Кроме того, в java неизвестны другие концепции оптимизации, такие как декларация параметров регистров.
Оптимизация не может быть принудительно объявлена в java, но выполняется компилятором и JIT. Во многих других языках эти объявления часто являются только подсказками компилятора (вы можете объявить больше параметров регистра, чем у процессора, остальные игнорируются).
Объявление java-методов static, final или private также является подсказкой для компилятора. Вы должны использовать его, но никаких гарантий. Производительность Java динамическая, а не статическая. Первый вызов системы всегда медленный из-за загрузки классов. Следующие вызовы выполняются быстрее, но в зависимости от объема памяти и времени выполнения наиболее распространенные вызовы оптимизируются с использованием системы, поэтому во время работы сервер может стать быстрее!
Ответ 4
То, что вы сказали выше, является правильным. Иногда конечные методы создаются как встроенные, но нет другого способа явно создать встроенную функцию в java.
Ответ 5
Пример реальной жизни:
public class Control {
public static final long EXPIRED_ON = 1386082988202l;
public static final boolean isExpired() {
return (System.currentTimeMillis() > EXPIRED_ON);
}
}
Затем в других классах я могу выйти, если код истек. Если я ссылаюсь на переменную EXPIRED_ON из другого класса, константа встроена в байтовый код, что очень затрудняет отслеживание всех мест в коде, который проверяет дату истечения срока действия. Однако, если другие классы вызывают метод isExpired(), вызывается фактический метод, то есть хакер может заменить метод isExpired другим, который всегда возвращает false.
Я согласен, было бы очень приятно заставить компилятор встроить статический окончательный метод во все классы, которые ссылаются на него. В этом случае вам не нужно даже включать класс Control, поскольку он не понадобится во время выполнения.
Из моих исследований это невозможно. Возможно, некоторые инструменты Obfuscator могут это сделать или вы можете изменить процесс сборки для редактирования источников перед компиляцией.
Как для доказательства того, что метод из класса управления помещен в другом классе во время компиляции, попробуйте запустить другой класс без класса Control в пути к классам.
Ответ 6
Ну, есть методы, которые можно назвать "встроенными" методами в java, но в зависимости от jvm. После компиляции, если машинный код метода меньше 35 байт, он сразу же будет передан встроенному методу, если машинный код метода меньше 325 байт, он может быть перенесен в встроенный метод, в зависимости от jvm.
Ответ 7
поэтому кажется, что существует arent, но вы можете использовать это обходное решение, используя guava или эквивалентную реализацию класса Function, потому что этот класс чрезвычайно прост, например:
assert false : new com.google.common.base.Function<Void,String>(){
@Override public String apply(Void input) {
//your complex code go here
return "weird message";
}}.apply(null);
да, это мертвый код, чтобы проиллюстрировать, как создать сложный блок кода (внутри {}) сделать что-то такое конкретное, что не должно мешать нам создавать какой-либо метод для него, AKA inline!
Ответ 8
Java9 имеет компилятор "Ahead of time", который выполняет несколько оптимизаций во время компиляции, а не во время выполнения, что можно рассматривать как inlining.