быстрее Math.exp () через JNI? - PullRequest
       25

быстрее Math.exp () через JNI?

10 голосов
/ 16 сентября 2008

Мне нужно очень часто вычислять Math.exp() из Java, возможно ли заставить собственную версию работать быстрее, чем Java Math.exp() ??

Я пробовал только jni + C, но это медленнее, чем просто java .

Ответы [ 15 ]

0 голосов
/ 16 сентября 2008

Существует стоимость, связанная с вызовом через границу JNI.

Если бы вы могли переместить цикл, который вызывает exp (), также в собственный код, так что есть только один собственный вызов, то вы могли бы получить лучшие результаты, но я сомневаюсь, что он будет значительно быстрее, чем решение на чистой Java .

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

0 голосов
/ 16 сентября 2008

Напишите свой собственный, с учетом ваших потребностей.

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

0 голосов
/ 16 сентября 2008

С использованием JNI связаны просто накладные расходы, см. Также: http://java.sun.com/docs/books/performance/1st_edition/html/JPNativeCode.fm.html

Так как другие предлагали попытаться сопоставить операции, связанные с использованием JNI.

0 голосов
/ 16 сентября 2008

Проблема использования JNI заключается в накладных расходах, связанных с вызовом JNI. Виртуальная машина Java довольно оптимизирована в наши дни, и вызовы встроенного Math.exp () автоматически оптимизируются для прямого вызова функции C exp (), и они могут даже быть оптимизированы в прямую сборку с плавающей точкой x87 инструкции.

0 голосов
/ 16 сентября 2008

Поскольку код Java будет скомпилирован в собственный код с помощью JIT-компилятора, на самом деле нет причин использовать JNI для вызова собственного кода.

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

...