Подтвердить что ты не робот

Когда 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;
}
4b9b3361

Ответ 1

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

Это не то, что связано с компиляцией вообще. Integer.bitCount является особенным в том смысле, что реализация помечена как заменяемая с помощью инструкции native asm POPCNT. В основном эта нативная инструкция используется при использовании функции Integer.bitCount (если ЦП поддерживает эту инструкцию), когда вы объявляете свою собственную копию функции, используется обычная реализация.

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

Ответ 2

JVM имеет список методов, обычно родных, которые заменяются встроенным машинным кодом. Этот список появляется во внутреннем заголовочном файле в OpenJDK, хотя я не могу найти ссылку на него в Интернете.

См. строку 581 в ссылке @Jack, предоставленной vmSymbols.hpp