Мои Конспекты
Главная | Обратная связь


Автомобили
Астрономия
Биология
География
Дом и сад
Другие языки
Другое
Информатика
История
Культура
Литература
Логика
Математика
Медицина
Металлургия
Механика
Образование
Охрана труда
Педагогика
Политика
Право
Психология
Религия
Риторика
Социология
Спорт
Строительство
Технология
Туризм
Физика
Философия
Финансы
Химия
Черчение
Экология
Экономика
Электроника

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



 

Интерфейс 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.

 

 

 

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

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