В частности, насколько экстремальным является увеличение производительности при использовании float вместо double в Java?В каких ситуациях лучше использовать float над двойным в Java?
ответ
Поскольку ваш вопрос в основном о производительности, эта статья представляет вам с некоторыми конкретными расчетами (держать в вид, что хотя эта статья относится к нейронным сетям, и ваши расчеты могут быть совершенно отличаются от того, что они делают в этой статье): 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% стоит рассмотреть.
Обычно, я бы использовать double
, потому что float
не имеет достаточной точности для многих численных случаев использования, и разница в производительности достаточно мал, чтобы не имело значения.
Как и всегда, производительность зависит от реализации, поэтому вам нужно будет сравнить свой конкретный случай, чтобы определить, имеет ли это «значение» или нет.
В целом я нашел:
- Разница в производительности для отдельных операций довольно мал, особенно на 64-битных машинах. И
float
, иlong
будут вписываться в 64-битное машинное слово. Часто существует нулевая разница. float
имеют небольшое преимущество в том, что они потребляют меньше памяти, и это может помочь уменьшить давление в кеше ЦП. Я обнаружил, что float будет на 30-50% быстрее при выполнении простых операций над большими массивами.
Являются ли эти достижения производительности на 64-битной или 32-разрядной машине? Какие размеры массивов? – Gray
@Gray Я думаю, что это усиление может быть достигнуто как на 32, так и на 64-битных системах, поскольку кеш-память L1 (и другие) может содержать в два раза больше чисел с плавающей точкой, чем двойные. Следовательно, мы можем добиться повышения производительности, уменьшая задержку поиска в памяти. Но (IMO) java-libs, предназначенные для более частого использования с удвоениями (двойные нажатия во многих режимах работы), поэтому мы не можем видеть этот прирост производительности каждый раз, когда мы меняем все парные числа на плавающие в исходном коде. – Dmitry
Есть два условия, которые должны быть выполнены, чтобы использовать поплавок вместо двойной:
- Там значительный, полезный прирост производительности.
- Поплавок достаточно точен для расчета.
Оценка первого условия относительно проста и легка. Измерьте задание, используя double. Измерьте снова, с теми же входами и другими условиями, используя float. Является ли версия с плавающей точкой значительно быстрее? Как правило, основное преимущество достигается за счет более эффективного использования кэшей, памяти и пропускной способности передачи данных.
Сложная часть оценивает второе условие. Получение недостаточно точных ответов или даже неправильных ответов бесполезно. Для многих расчетов относительно простой анализ может показать двойное достаточно точное. Отображение же для float часто намного сложнее.
Вы сами запускали эти тесты? Я подозреваю, что производительность улучшится гораздо более незначительно, если вообще. – Gray
@Gray У меня до сих пор не было хорошего случая для 'float' в моем собственном коде. Я работал с клиентом, который получил значительный выигрыш от 'float' при выполнении преобразований на очень больших массивах сейсмических данных. Усиление произошло благодаря более эффективному использованию ввода-вывода, памяти, пропускной способности доступа к памяти и кэшам данных. –
Почему 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 могут это сделать?
short в java будет автоматически преобразован в int. короткая потребляет 4 байта, например, int. (кроме массивов) – AlexWien
«Больше памяти требуется больше от вашего оборудования, это означает, что будет использоваться больше батареи» - вы уверены в этом? Насколько я знаю, использование памяти не влияет на потребление энергии. A 0 берет много энергии для хранения в виде 1. –
@SteveKuo, создавая 1000 двойных потребностей больше из ОЗУ, чем создание 1000 из ints, это не будет иметь в виду потребление энергии? Даже если оба магазина 0? –
В основном на встроенных системах без процессора с быстрыми двойными операциями. Например, навигационные системы с интенсивными вычислениями процессора. Но в java многие Math libs неявно преобразуются в double, поэтому во многих случаях нет смысла использовать float.
поплавкам нужна половина памяти, и преимущество, если у вас есть очень большие массивы и ограниченная память (во встраиваемых устройствах)
- 1. , в каких ситуациях использование позиционирования было бы лучше, чем плавать?
- 2. В каких ситуациях подходит CopyOnWriteArrayList?
- 3. Какая из этих методов управления памятью лучше в каких ситуациях?
- 4. В каких ситуациях VkFence лучше, чем vkQueueWaitIdle для vkQueueSubmit?
- 5. В каких ситуациях я должен использовать Entity SQL?
- 6. В каких ситуациях статическое распределение тарифов лучше, чем динамическое распределение?
- 7. В каких ситуациях требуется разрешение вместо let *?
- 8. В чем разница между dispatch_time и dispatch_walltime и в каких ситуациях лучше использовать один или другой?
- 9. В каких ситуациях произойдет сбой в поле field.setAccessible (true) Java?
- 10. В каких ситуациях используется восьмеричная база?
- 11. Почему NaN полезен и в каких ситуациях
- 12. В каких ситуациях я не могу использовать SUMPRODUCT вместо MMULT?
- 13. определяют, какие постоянные постоянные в каких ситуациях
- 14. В каких случаях лучше использовать регулярные выражения?
- 15. В каких ситуациях изменяется контекст управляемого объекта?
- 16. В каких ситуациях может применяться PHP-семафор?
- 17. В каких ситуациях называется конструктор копии C++?
- 18. В каких ситуациях следует избегать модульного тестирования?
- 19. В каких ситуациях я должен сохранить объект?
- 20. В каких ситуациях NavigationService.CanGoBack возвращает false?
- 21. В каких ситуациях модель шаблонов Monostate?
- 22. В каких ситуациях WPF возвращает клавиатуру в основное окно?
- 23. Лучше ли использовать String.format над строкой Конкатенация в Java?
- 24. В каких сценариях лучше использовать json_encode(), чем использовать serialize()?
- 25. В object.initialize, лучше ли использовать self. над @?
- 26. В каких случаях лучше использовать очереди сообщений вместо Twitter Storm
- 27. Java, работа над двойным - после запятой
- 28. В каких ситуациях подключение tcp должно ждать ACK?
- 29. В каких ситуациях Flash/SWF неправильно работает в разных браузерах?
- 30. В каких ситуациях блок finally не выполняется в C#?
От этого зависит. Как и во всех вопросах производительности, ** измерьте это. ** –
Я считаю, что все процессоры рассматривают поплавки как удваивающиеся, когда фактически выполняют вычисления.Единственное отличие - это объем памяти. – nhgrif
Спасибо - именно то, что я искал. – Julian