Целочисленная математика и математика с плавающей точкой как таковая в Java передаются непосредственно аппаратному обеспечению, и вычисления как таковые в принципе не медленнее, чем, скажем, в C или FORTRAN. Библиотечные процедуры для таких вещей, как трансцендентные функции (sin()
, sqrt()
, log()
и т. Д.) На самом деле реализованы на C, поэтому, опять же, нет веских оснований искать другие библиотеки.
Есть некоторая информация, которую я хотел бы, чтобы ваш вопрос дал нам. Вы упомянули, что идет много вычислений, и это хруст числа. Но вы ничего не говорите нам о том, как эти номера организованы и доступны. Это, наверное, интересная и полезная информация. Если вы используете сложные объектные структуры для хранения ваших данных, доступ к этим структурам займет время. Если ваши результаты создают новые объекты, это тоже дорого. Если вы используете массивы, это тоже объекты. Многомерные массивы в Java - это массивы массивов, и индексирование по нескольким измерениям может разрешить ссылки на объекты, которые работают медленнее, чем в других языках. Хотя у меня нет тестов, чтобы доказать это, я подозреваю, что вам лучше заменить многомерные массивы на одномерные и немного «ручного» расчета индекса. Вам, безусловно, лучше использовать массивы фиксированного размера, возможно, с небольшим провалом, а не создавать и отбрасывать новые массивы для каждого вычисления. Наконец, многие из объектно-ориентированных приемов, делающих структуру вашей программы более «элегантной» и «гибкой», имеют тенденцию вносить много ненужной объектной ориентации с сопутствующими замедлениями. Примитивно, но просто, как правило, быстрее.
Очень простая оптимизация может состоять в том, чтобы просто использовать опцию -server
вашей JVM (если она доступна), чтобы получить выгоду от дополнительной предварительной компиляции, если вы этого еще не сделали.
Я рекомендую другим людям, чтобы вы профилировали свои расчеты, прежде чем приступить к слепой ре-архитектуре своей программы. В удивительных местах могут быть узкие места.