Главная » Java, Советы » Соблюдайте осторожность при использовании машинно-зависимых методов

0

 

Интерфейс Java Native Interface (JNI) дает возможность приложениям на языке Java делать вызов" машинно-зависимых" методов (native method), т. е. специальных методов, написанных на машинно-зависимом языке программирования, таком как С или С++. Перед тем как вернуть управление языку Java, машинно-зависимые методы могут выполнить любые вычисления, используя машинно-зависимый язык.

Исторически машинно-зависимые методы имели три основные области применения. Они предоставляли доступ к механизмам, соответствующим конкретной платформе, таким как реестр и блокировка файла. Они обеспечивали доступ к унаследованным библиотекам кода, которые, в свою очередь, могли дать доступ к унаследованным данным. Наконец, машинно-зависимые методы использовались для того, чтобы писать на машинно-зависимом языке те части приложений, которые критичны для быстродействия, тем самым повышая общую производительность.

Применение машинно-зависимых методов для доступа к механизмам, специфичным для данной платформы, абсолютно оправданно. Однако по мере своего развития платформа Java предоставляет все больше и больше возможностей, которые прежде можно было найти лишь на главных платформах. Например, появившийся в версии 1.4 пакет jаvа.util.рrefs выполняет функции реестра. Оправданно также использование машинно-зависимых методов для доступа к унаследованному коду, однако есть более хорошие способы доступа к унаследованному коду. Например, интерфейс JDBC (Jаvа DataBase Connectivity) обеспечивает доступ к унаследованным базам данных.

В версии 1.3 использование машинно-зависимых методов для повышения производительности редко оправдывает себя. В предыдущих версиях это часто было необходимо, однако сейчас созданы более быстрые реализации JVM. И теперь для большинства задач можно получить сравнимую производительность, не прибегая к машинно-зависимым методам. Например, когда в версию 1.1 был включен пакет java.math.BigInteger был реализован поверх быстрой библиотеки арифметических операций с многократно увеличенной точностью, написанной на языке С. В то время это было необходимо для получения приемлемой производительности. В версии 1.3 класс BigInteger полностью переписан на языке Java и тщательно отрегулирован. Для большинства операций и размеров операндов новая версия оказывается быстрее пер во начальной во всех реализациях JVM 1.3 компании Sиn. 150

Применение машинно-зависимых методов имеет серьезные недостатки. Поскольку машинно-зависимые методы небезопасны (статья 24), использующие их приложения теряют устойчивость к ошибкам, связанным с памятью. Для каждой новой платформы машинно-зависимый программный код необходимо компилировать заново, может потребоваться даже его изменение. С переходом на машинно-зависимый код и с возвратом в Java связаны высокие накладные расходы, а потому, если машинно-зависимый методы выполняют лишь небольшую работу, их применение может снизить производительность приложения. Наконец, машинно-зависимые методы сложно писать и трудно читать.

Подведем итоги. Хорошо подумайте, прежде чем использовать машинно-зависимые методы. Если их и можно применять для повышения производительности, то крайне редко. Если вам необходимо использовать машинно-зависимые методы для доступа к низкоуровневым ресурсам или унаследованным библиотекам, пишите как можно меньше машинно-зависимого кода и тщательно его тестируйте. Единственная ошибка в машинно-зависимом коде может полностью разрушить все ваше приложение.

 

Источник: Джошуа Блох, Java TM Эффективное программирование, Издательство «Лори»

По теме:

  • Комментарии