Вы не инициализировали a
и b
, только объявили их. Существует тонкая разница.
int a = 0;
int b = 0;
По крайней мере, это для C ++, я полагаю, что Java - это одна и та же концепция.
Просто чтобы добавить мои 2 цента. Я сравнил некоторые из этих библиотек. Я попытался матрично умножить матрицу удвоений 3000 на 3000 с самим собой. Результаты приведены ниже.
При использовании многопоточного ATLAS с C / C ++, Octave, Python и R потребовалось около 4 секунд.
При использовании Jama с Java потребовалось 50 секунд.
При использовании Colt и Parallel Colt с Java затраченное время составило 150 секунд!
При использовании JBLAS с Java затраченное время снова составило около 4 секунд, поскольку JBLAS использует многопоточный ATLAS.
Мне было ясно, что библиотеки Java работают не очень хорошо. Однако, если кому-то приходится писать код на Java, лучшим вариантом будет JBLAS. Джама, Кольт и Параллельный Кольт не быстрые.
Построение на сообщении Varkhan, что определенный для Pentium собственный код добился бы большего успеха:
jBLAS: этапный альфой проект с обертками JNI для Атласа: http://www.jblas.org .
MTJ: Другой такой проект: http://code.google.com/p/matrix-toolkits-java/
Код Linalg, который полагается в большой степени на Pentiums и векторные вычислительные возможности более поздних процессоров (запускающийся с расширений MMX, как LAPACK и теперь Атлас BLAS) "фантастически не оптимизирован", но просто промышленный стандарт. Для тиражирования той производительности в Java, Вы испытываете необходимость в собственных библиотеках. У меня была та же проблема производительности, как Вы описываете (главным образом, чтобы смочь вычислить разложения Choleski) и ничто не нашли действительно эффективным: Jama является чистым Java, так как он, как предполагается, просто шаблон и ссылочный набор для реализаторов для следования..., которого никогда не происходило. Вы знаете математическое свободное городское население Apache... Что касается КОЛЬТА, я должен все еще протестировать его, но это, кажется, полагается в большой степени на улучшения Ниндзя, большинство которых было достигнуто путем создания специального компилятора Java, таким образом, я сомневаюсь, что это собирается помочь. В той точке я думаю, что нам "просто" нужно коллективное усилие создать собственный компонент реализация Jama...
Мы использовали КОЛЬТ для некоторых довольно больших серьезных финансовых вычислений и были очень довольны им. В нашем в большой степени представленном коде мы почти никогда не должны были заменять реализацию КОЛЬТА одним собственным.
В их собственном тестировании (очевидно весьма зависимом), я думаю, что они требуют в факторе 2 из Intel оптимизированных рукой ассемблерных стандартных программ. Прием к использованию его хорошо удостоверяется, что Вы понимаете их принципы проектирования и избегаете постороннего объектного выделения.
ON UPDATE CASCADE
позволяет Вам обновить значение в единственном месте, если Ваша DBMS doesn' t поддерживают ту функцию. (Oracle doesn' t.), Но когда you' ре, имеющее дело с адресами, обычно необходимо проявлять дополнительную заботу к , избегают обновление некоторых видов исторических данных, как адреса на счетах и счетах. И that' s верный независимо от того, является ли Ваш внешний ключ текстом или целым числом.
– Mike Sherrill 'Cat Recall'
5 October 2011 в 00:11
Я не могу действительно прокомментировать определенные библиотеки, но в принципе существует мало причины таких операций, чтобы быть медленнее в Java. Горячая точка обычно делает виды вещей, которые Вы ожидали бы, что компилятор сделает: это компилирует основные математические операции на переменных Java к соответствующим машинным командам (это использует инструкции SSE, но только один на операцию); доступы к элементам массива компилируются для использования "необработанных" инструкций MOV, как Вы ожидали бы; это принимает решения о том, как выделить переменные регистрам, когда это может; это переупорядочивает инструкции использовать в своих интересах архитектуру процессора... Возможное исключение - то, что, поскольку я упомянул, Горячая точка только выполнит одну операцию на инструкцию SSE; в принципе у Вас могла быть фантастически оптимизированная матричная библиотека, которая выполнила несколько операций на инструкцию, хотя я не знаю, делает ли, скажем, Ваша конкретная библиотека FORTRAN так или если такая библиотека даже существует. Если это делает, в настоящее время нет никакого пути к Java (или по крайней мере, Горячая точка) для конкуренции с тем (хотя Вы могли, конечно, записать свою собственную собственную библиотеку с теми оптимизациями для вызова от Java).
Поэтому, что все это означает? Хорошо:
, помеха А для операций над матрицей часто является проблемами местности данных, которые возникают, когда необходимо пересечь и строку строкой и столбец столбцом, например, в умножении матриц, так как необходимо хранить данные в порядке, который оптимизирует один или другой. Но если Вы пишете от руки код, Вы иногда можете операции объединения для оптимизации местности данных (например, если Вы умножаете матрицу на ее преобразование, можно превратить обход столбца в обход строки, если Вы пишете специализированную функцию вместо того, чтобы комбинировать две библиотечных функции). Как обычно, в жизни, библиотека даст Вам неоптимальную производительность в обмен на более быструю разработку; необходимо решить, как важная производительность Вам.
Вы смотрели на Математическая Библиотека Ядра Intel ? Это утверждает, что превзошло по характеристикам даже ATLAS. MKL может быть используется в Java через обертки JNI.
Matrix Tookits Java (MTJ) уже был упоминалось ранее, но, возможно, стоит упомянуть еще раз для всех, кто наткнулся на эту тему. Для тех, кто заинтересован, похоже, также идет разговор о том, чтобы MTJ заменила библиотеку linalg в apache commons math 2.0 , хотя я не уверен, как это продвигается в последнее время.
Я обнаружил, что если вы создаете много многомерных матриц, вы можете ускорить Jama примерно на 20%, если измените его так, чтобы он использовал одномерный массив вместо двухмерного. Это связано с тем, что Java не так эффективно поддерживает многомерные массивы. т.е. он создает массив массивов.
Colt уже делает это, но я обнаружил, что он сложнее и мощнее, чем Jama, что может объяснить, почему простые функции работают медленнее с Colt.
Ответ действительно зависит от того, насколько вы делаю. Джама не поддерживает то, что может сделать Кольт, что имеет большее значение.
Существует множество различных свободно доступных библиотек линейной алгебры Java. http://www.ujmp.org/java-matrix/benchmark/ К сожалению, этот тест дает вам информацию только об умножении матриц (с транспонированием теста не позволяет различным библиотекам использовать их соответствующие конструктивные особенности).
Вам следует обратить внимание на то, как эти библиотеки линейной алгебры работают, когда их просят вычислить различные матрицы разложения. http://ojalgo.org/matrix_compare.html
Вы можете проверить проект jblas . Это относительно новая библиотека Java, которая использует BLAS, LAPACK и ATLAS для высокопроизводительных матричных операций.
Разработчик опубликовал несколько тестов , в которых jblas выгодно отличается от MTJ и Colt.
Я главный автор jblas и хотел бы отметить, что я выпустил версию 1.0 в конце декабря 2009 года. Я много работал над упаковкой, а это значит, что теперь можно просто скачать "жирную банку" с библиотеками ATLAS и JNI для Windows, Linux, Mac OS X, 32 и 64 bit (кроме Windows). Таким образом, вы получите природную производительность, просто добавив jar-файл к вашему клас-спату. Проверьте его по адресу http://jblas.org!
Вы должны добавить Apache Mahout в свой список покупок.