Когда JVM будет использовать встроенные функции
Почему определенные шаблоны кода, когда они присутствуют во внутренних классах JVM, превращаются в встроенную функцию, тогда как те же шаблоны при вызове из моего собственного класса - нет.
Пример:
Функция bitCount при вызове изнутри Integer.bitCount(i) будет превращена в встроенную. Но когда копируется в мой класс и затем вызывается, выполнение займет гораздо больше времени.
сравнить
Integer.bitCount(i)
MyClass.bitCount(i)
public static int bitCount(int i) {
// HD, Figure 5-2
i = i - ((i >>> 1) & 0x55555555);
i = (i & 0x33333333) + ((i >>> 2) & 0x33333333);
i = (i + (i >>> 4)) & 0x0f0f0f0f;
i = i + (i >>> 8);
i = i + (i >>> 16);
return i & 0x3f;
}
2 ответа
Ответ прост: внутренняя функция определена таким образом, потому что существует более быстрый, собственный способ получения результата функции, и он применяется в случае, благодаря заданному отображению.
Это не то, что связано с компиляцией вообще. Integer.bitCount
является особенным в том смысле, что реализация помечена как заменяемая нативной ассемблерной инструкцией POPCNT. В основном эта нативная инструкция используется при использовании Integer.bitCount
функция (если процессор поддерживает эту инструкцию), когда вы объявляете свою собственную копию функции, используется нормальная реализация.
Почему JVM может распознать, что функция может быть оптимизирована? Поскольку это где-то жестко закодировано в JDK, это не имеет ничего общего с подобием кода.
В JVM есть список методов, обычно нативных, который заменяется встроенным машинным кодом. Этот список появляется во встроенном заголовочном файле OpenJDK, хотя я не могу найти ссылку на него в Интернете.
См. Строку 581 в ссылке @Jack, предоставленной vmSymbols.hpp.