Показаны сообщения с ярлыком jvm. Показать все сообщения
Показаны сообщения с ярлыком jvm. Показать все сообщения

суббота, 23 марта 2013 г.

Intrinsic-методы

Если вы скопируете код String.equals() в свою программу и сравните производительность вашего метода и настоящего, то, скорее всего, будете удивлены, как и автор вопроса: скорость вашей реализации может быть медленнее в десятки раз. JVM просто заменяет код native-реализацией, несмотря на то, что они не помечены соответствующим словом. Такие заменяемые методы называют intrinsic-методами.

Официальной информации немного. Список таких методов можно получить ковыряя исходники JVM. Тезка предложил скрипт для получения списка классов, у которых есть такие методы. Однако не все методы в них intrinsic.

$ grep do_intrinsic vmSymbols.hpp | perl -pe s/\#.*//g | perl -pe s/\\/\\/.*//g |  awk '{ print $2 }' | sort | uniq | perl -pe s/_/./g | perl -pe s/,//g

java.lang.Boolean
java.lang.Byte
java.lang.Character
java.lang.Class
java.lang.Double
java.lang.Float
java.lang.Integer
java.lang.invoke.InvokeDynamic
java.lang.invoke.MethodHandle
java.lang.invoke.MethodHandleNatives
java.lang.Long
java.lang.Math
java.lang.Object
java.lang.reflect.Array
java.lang.reflect.Method
java.lang.ref.Reference
java.lang.Short
java.lang.String
java.lang.StringBuffer
java.lang.StringBuilder
java.lang.System
java.lang.Thread
java.lang.Throwable
java.nio.Buffer
java.util.Arrays
sun.misc.AtomicLongCSImpl
sun.misc.Unsafe
sun.reflect.Reflection