2014-01-30 3 views
8

В частности, насколько экстремальным является увеличение производительности при использовании float вместо double в Java?В каких ситуациях лучше использовать float над двойным в Java?

+0

От этого зависит. Как и во всех вопросах производительности, ** измерьте это. ** –

+0

Я считаю, что все процессоры рассматривают поплавки как удваивающиеся, когда фактически выполняют вычисления.Единственное отличие - это объем памяти. – nhgrif

+0

Спасибо - именно то, что я искал. – Julian

ответ

5

Поскольку ваш вопрос в основном о производительности, эта статья представляет вам с некоторыми конкретными расчетами (держать в вид, что хотя эта статья относится к нейронным сетям, и ваши расчеты могут быть совершенно отличаются от того, что они делают в этой статье): http://web.archive.org/web/20150310213841/http://www.heatonresearch.com/content/choosing-between-java%E2%80%99s-float-and-double

Некоторые из соответствующего материала из ссылки воспроизводятся здесь:

Оба типа double и float могут поддерживать относительно большие числа. Верхние и нижний диапазон действительно не учитываются для нейронных сетей. Float может обрабатывать числа между 1.40129846432481707e-45 до 3.40282346638528860e + 38 ... В принципе, поплавок может обрабатывать около 7 знаков после запятой. Двойной может обрабатывать около 16 знаков после запятой.

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

Пропуская весь код, таблица на веб-сайте показывает, что для умножения матрицы 100x100 у них коэффициент усиления составляет около 10%, если они используют удвоение. Для умножения матрицы 500x100 потеря производительности из-за использования удвоений составляет около 7%. А для умножения матрицы 1000x1000 эта потеря составляет около 17%.

Для небольшой матрицы матрицы 100x100 для поплавка на самом деле можно уменьшить производительность. По мере увеличения размера матрицы увеличивается процентное увеличение . При очень большой матрице прирост производительности увеличивается до 17%. 17% стоит рассмотреть.

9

Обычно, я бы использовать double, потому что float не имеет достаточной точности для многих численных случаев использования, и разница в производительности достаточно мал, чтобы не имело значения.

Как и всегда, производительность зависит от реализации, поэтому вам нужно будет сравнить свой конкретный случай, чтобы определить, имеет ли это «значение» или нет.

В целом я нашел:

  • Разница в производительности для отдельных операций довольно мал, особенно на 64-битных машинах. И float, и long будут вписываться в 64-битное машинное слово. Часто существует нулевая разница.
  • float имеют небольшое преимущество в том, что они потребляют меньше памяти, и это может помочь уменьшить давление в кеше ЦП. Я обнаружил, что float будет на 30-50% быстрее при выполнении простых операций над большими массивами.
+0

Являются ли эти достижения производительности на 64-битной или 32-разрядной машине? Какие размеры массивов? – Gray

+1

@Gray Я думаю, что это усиление может быть достигнуто как на 32, так и на 64-битных системах, поскольку кеш-память L1 (и другие) может содержать в два раза больше чисел с плавающей точкой, чем двойные. Следовательно, мы можем добиться повышения производительности, уменьшая задержку поиска в памяти. Но (IMO) java-libs, предназначенные для более частого использования с удвоениями (двойные нажатия во многих режимах работы), поэтому мы не можем видеть этот прирост производительности каждый раз, когда мы меняем все парные числа на плавающие в исходном коде. – Dmitry

0

Есть два условия, которые должны быть выполнены, чтобы использовать поплавок вместо двойной:

  1. Там значительный, полезный прирост производительности.
  2. Поплавок достаточно точен для расчета.

Оценка первого условия относительно проста и легка. Измерьте задание, используя double. Измерьте снова, с теми же входами и другими условиями, используя float. Является ли версия с плавающей точкой значительно быстрее? Как правило, основное преимущество достигается за счет более эффективного использования кэшей, памяти и пропускной способности передачи данных.

Сложная часть оценивает второе условие. Получение недостаточно точных ответов или даже неправильных ответов бесполезно. Для многих расчетов относительно простой анализ может показать двойное достаточно точное. Отображение же для float часто намного сложнее.

+0

Вы сами запускали эти тесты? Я подозреваю, что производительность улучшится гораздо более незначительно, если вообще. – Gray

+0

@Gray У меня до сих пор не было хорошего случая для 'float' в моем собственном коде. Я работал с клиентом, который получил значительный выигрыш от 'float' при выполнении преобразований на очень больших массивах сейсмических данных. Усиление произошло благодаря более эффективному использованию ввода-вывода, памяти, пропускной способности доступа к памяти и кэшам данных. –

2

Почему int вместо long?

Почему short вместо int?

Почему byte вместо short?

Это все о целях использования и использовании памяти. Теоретически, больше диапазона означает больше памяти, больше памяти требуется больше от вашего оборудования, и это означает, что будет использоваться больше батареи.

Современные машины имеют высокую производительность с примитивными типами. Так что, в конце концов, вы не видите никакой разницы, если вы используете long вместо double и наоборот, но Internet Connections может быть медленным в зависимости от страны, поэтому в этом случае лучше использовать float вместо double.

Позволяет говорить о short vs int.

Краткое использование меньше памяти, чем int, но это занимает 30% больше времени, чтобы быть создан (Java), поэтому было бы лучше использовать Визитки int вместо short? Зависит от массива с 100 short s будет использовать гораздо меньше памяти, чем массив из 100 int s.

Петля с short может быть более эффективной, чем петля с int.

В Интернете short намного эффективнее, чем int, не имеет значения, если требуется еще 30%, лента будет небольшой, и опыт будет лучше.

Я бы предложил вам использовать только то, что вам нужно. Помните: почему 80, если 8 могут это сделать?

+0

short в java будет автоматически преобразован в int. короткая потребляет 4 байта, например, int. (кроме массивов) – AlexWien

+2

«Больше памяти требуется больше от вашего оборудования, это означает, что будет использоваться больше батареи» - вы уверены в этом? Насколько я знаю, использование памяти не влияет на потребление энергии. A 0 берет много энергии для хранения в виде 1. –

+0

@SteveKuo, создавая 1000 двойных потребностей больше из ОЗУ, чем создание 1000 из ints, это не будет иметь в виду потребление энергии? Даже если оба магазина 0? –

1

В основном на встроенных системах без процессора с быстрыми двойными операциями. Например, навигационные системы с интенсивными вычислениями процессора. Но в java многие Math libs неявно преобразуются в double, поэтому во многих случаях нет смысла использовать float.

поплавкам нужна половина памяти, и преимущество, если у вас есть очень большие массивы и ограниченная память (во встраиваемых устройствах)

Смежные вопросы