Пользовательские математические функции и поставляемые математические функции?

В основном я делаю программу на Java, которая должна будет довольно быстро выполнять множество вычислений (каждый кадр, стремясь как минимум к 30 кадрам в секунду). В основном это будут тригонометрические и степенные функции. Вопрос, который я задаю: что быстрее: использование математических функций, уже предоставленных Java? Или писать свои собственные функции для запуска?


person Yaakov Schectman    schedule 15.01.2015    source источник
comment
Объективный ответ заключается в том, что это зависит от того, насколько хорошо вы можете с этим справиться и так далее.   -  person Stephen C    schedule 16.01.2015
comment
Как правило, предоставляемые библиотеки математических функций для языка всегда будут быстрее, чем те, которые вы предоставляете, поскольку они имеют возможность оптимизации способами, недоступными для вас (если только вы не пишете свои). на ассемблере).   -  person Taryn East    schedule 16.01.2015
comment
Даже если java.lang.Math не имеет нужной вам функции, наверняка кто-то еще решил ту же проблему и написал библиотека для ее решения. На самом деле, здесь не изобретено (синдром NIH) — широко известный антишаблон в разработке программного обеспечения, тесно связанный с связанных с изобретением велосипеда.   -  person gknicker    schedule 16.01.2015


Ответы (5)


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

person Louis Wasserman    schedule 15.01.2015
comment
Хотя я согласен с общей оценкой, создание пользовательских реализаций функций не обязательно требует много работы в зависимости от навыков программиста и ограничений, наложенных на функцию (функции). Более низкая точность — это лишь один из возможных компромиссов, другие поддерживают только ограниченный диапазон аргументов [особенно полезно в случае тригонометрических функций] и не имеют дело с особыми случаями [очень полезно для pow(), что приводит к множеству особых случаев] . - person njuffa; 16.01.2015

Вы захотите использовать функции java.lang.Math, так как большинство из них запускают native в JVM. вы можете увидеть исходный код здесь.

person James C. Taylor IV    schedule 15.01.2015
comment
Даже методы, которые не являются родными, могут быть внутренними, то есть код Java никогда не запускается и во время выполнения заменяется JVM более эффективным кодом. - person assylias; 16.01.2015

Многие очень умные и высококвалифицированные люди в течение многих лет прикладывали много усилий для того, чтобы математические функции работали как можно быстрее и точнее. Так что, если вы не умнее их всех и у вас есть годы свободного времени, чтобы потратить на это, очень маловероятно, что вы сможете работать лучше.

Большинство из них тоже нативные — на самом деле они не на Java. Так что писать их более быстрые версии на Java не получится. Вам, вероятно, лучше всего использовать смесь C и языка ассемблера, когда вы начинаете писать свой собственный; и вам нужно знать все особенности любого оборудования, на котором вы собираетесь это запускать.

Более того, текущие реализации проверены на протяжении многих лет тем фактом, что миллионы людей по всему миру так или иначе используют Java. У вас не будет доступа к одному и тому же набору тестировщиков, поэтому ваши функции автоматически будут более подвержены ошибкам, чем стандартные. Это неизбежно.

Итак, вы все еще думаете о написании собственных функций?

person Dawood ibn Kareem    schedule 15.01.2015

Если вы можете выдержать относительную ошибку 1e-15ish (или больше похожую на 1e-13ish для pow(double,double)), вы можете попробовать это, что должно быть быстрее, чем java.lang.Math, если вы его часто называете: http://sourceforge.net/projects/jafama/

Как некоторые говорили, обычно трудно превзойти java.lang.Math в чистой Java, если вы хотите сохранить аналогичную (1-ulp-ish) точность, но немного меньшая точность в двойной точности часто вполне терпима (и все же гораздо больше точнее, чем при вычислениях с числами с плавающей запятой), и может обеспечить некоторое заметное ускорение.

person Jeff    schedule 25.01.2015

Что может быть вариантом, так это кэширование значений. Если вы знаете, что вам понадобится только фиксированный набор значений или если вы можете обойтись без идеальной точности, это может сэкономить много времени. Скажем, если вы хотите нарисовать много кругов, предварительно вычислите значения sin и cos для каждой степени. Затем используйте эти значения при рисовании. Большинство кругов будут достаточно маленькими, чтобы вы не могли увидеть разницу, а небольшое количество очень больших кругов можно сделать с помощью библиотек.

Обязательно протестируйте, стоит ли оно того. На моем 5-летнем макбуке я могу делать миллион оценок cos в секунду.

person Salix alba    schedule 18.01.2015