Производительность Java в числовых алгоритмах

if (StartDate < EndDate)
   // code

, если Вы просто хотите даты, а не время

if (StartDate.Date < EndDate.Date)
    // code
6
задан Nope 9 November 2009 в 01:22
поделиться

8 ответов

Это происходит со стороны .NET, но я на 90% уверен, что это относится и к Java. Хотя JIT будет в некоторой степени использовать инструкции SSE там, где это возможно, в настоящее время он не выполняет автоматическую векторизацию кода при работе, например, с умножением матриц. Ручная векторизация C ++ с использованием встроенных функций компилятора / встроенной сборки определенно будет здесь быстрее.

1
ответ дан 17 December 2019 в 20:33
поделиться

Одно из самых слабых мест в java - (собственные) матричные операции. Это связано с природой матриц Java:

  • Вы не можете объявить матрицу прямоугольной, т.е. каждая строка может иметь разное количество столбцов.

  • Матрица технически не является «матрицей двойных чисел (или целых чисел, ...)», а массивом массивов .... Большое различие состоит в том, что, поскольку массивы являются объектами Java, вы можете назначить один и тот же объект массива более чем одной строке.

Эти два свойства делают невозможными многие стандартные оптимизации матриц для компилятора.

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

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

Эти два свойства делают невозможным выполнение многих стандартных оптимизаций матриц для компилятора.

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

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

Эти два свойства делают невозможным выполнение многих стандартных оптимизаций матриц для компилятора.

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

1
ответ дан 17 December 2019 в 20:33
поделиться

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

После этого вы можете использовать JNI для вызова его из Java, если это необходимо.

Java не предназначена для таких высокопроизводительных арифметических вычислений. Если вы зависите от них, я бы рекомендовал выбрать подходящий низкоуровневый язык для реализации этого. Или, в качестве альтернативы, вы можете написать часть, ориентированную на производительность, на языке низкого уровня, а затем подключить ее к интерфейсу Java, используя JNI или какой-либо другой метод IPC.

1
ответ дан 17 December 2019 в 20:33
поделиться

Этот представляет собой ссылку на страницу выбора языка программирования для java и c ++, которая даст вам сравнение скорости java для нескольких алгоритмов с интенсивными вычислениями. Он также покажет вам, как выглядит Java-код с максимальной производительностью. По большей части, для этих нескольких конкретных тестов Java требовалось больше времени (но не более чем в 2 или 3 раза) для запуска.

1
ответ дан 17 December 2019 в 20:33
поделиться

Во-вторых, лучше всего проверить это на себе, так как производительность будет несколько отличаться в зависимости от того, что именно вы делаете. Мне трудно поверить в ответ Шейна С. Мэйсона о том, что производительность Java будет такой же, как производительность C ++ или Fortran, поскольку даже C ++ и Fortran на самом деле несопоставимы для некоторых алгоритмов научных вычислений.

У меня есть код вычислительной гидродинамики, который я написал на C ++, и тот же код, по сути, переведенный на Фортран. Я пока не совсем уверен, почему, но версия Fortran примерно в два раза быстрее, чем версия C ++. Я бы предположил, что с такими функциями, как проверка границ и сборка мусора, Java будет медленнее, чем оба, но я не узнаю, пока не протестирую.

0
ответ дан 17 December 2019 в 20:33
поделиться

Это может настолько зависеть от того, что вы делаете в коде C ++.

Например, вы используете графический процессор? Править Я забыл о jogl, так что здесь может конкурировать Java.

Если вы распараллеливаете с использованием STM или разделяемой памяти, тогда Java не может конкурировать. Ссылка на анализ параллельного умножения матриц: http://www.cs.utexas.edu/users/plapack/papers/ipps98/ipps98.html

Достаточно ли у вас памяти для выполнения вычислений в памяти , так что сборщик мусора не понадобится, и вы настроили сборщик мусора для оптимальной производительности? Тогда, возможно, Java может быть конкурентоспособной.

Используете ли вы многоядерность и оптимизирован ли C ++ для использования преимуществ этой архитектуры? Тогда Java не сможет конкурировать.

Если вы используете несколько компьютеров, связанных вместе, тогда Java не сможет конкурировать.

Используете ли вы любую их комбинацию, тогда это будет зависеть от конкретной реализации .

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

Вы можете посмотреть, есть ли улучшения, например, по сравнению с Haskell или Erlang , по сравнению с вашим C ++, поскольку эти языки лучше подходят для этого типа работы.

0
ответ дан 17 December 2019 в 20:33
поделиться

Java использует компилятор Just in Time (JIT) для преобразования байт-кода в собственный машинный язык - поэтому при первом прохождении блока кода он будет медленнее, но как только сегмент «нагреется» up 'производительность будет эквивалентной. Короче говоря, числовые показатели довольно хороши.

-4
ответ дан 17 December 2019 в 20:33
поделиться

Интересуют ли вас такие вычисления - быстрое преобразование Фурье, последовательная сверх релаксация Якоби, интегрирование Монте-Карло, Sparse Matrix Mult, Dense LU Matrix Factorisation?

Они составляют Составной тест SciMark 2.0 , который вы можете запустить как апплет на вашем компьютере.

Существуют также ANSI C версии программ и документ Intel (pdf) по оптимизации и перекомпиляции SciMark для C ++ .


Аналогичным образом вы можете использовать Java Grande Forum Benchmark Suite и программы сравнения C .

0
ответ дан 17 December 2019 в 20:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: