Сейчас я работаю над численными вычислениями в конкретном исследовании. домен и унаследовали пакет Java, давно реализованный моей командой. Моя задача сейчас — оптимизировать его работу. В пакете широко используется ArrayList. Насколько мне известно, Java, по крайней мере до версии 9, которую я использую, не поддерживает ArrayList примитивных типов из-за стирания типов в дженериках Java.
Там Есть несколько проблем:
- Накладные расходы на хранение: Double — это класс-оболочка для double. Поскольку Double является объектом, он включает заголовок объекта, который занимает 8 байт. Таким образом, каждый объект Double занимает 16 байт памяти.
- Несмежная память: ArrayList внутренне использует массив для хранения Объекты Double, т. е. данные Double[]. Этот массив содержит ссылки на экземпляры Double. Эти экземпляры не хранятся в куче подряд. Например, если Double[] data = {1.0, 2.0, ссылки в данных являются смежными, но фактические объекты Double, на которые указывают эти ссылки, — нет. Это приводит к плохой локализации и частым промахам в кэше из-за необходимости разыменования этих указателей.
- Распаковка и автоупаковка: возникают дополнительные издержки из-за распаковка и автоупаковка при выполнении сравнений и вычислений с помощью Double.
Каковы наилучшие способы избежать упомянутых накладных расходов? Я приветствую любые ответы на приведенные ниже вопросы.
- Есть ли в последних версиях Java какие-либо новые функции, позволяющие использовать ArrayList с примитивными типами ?
- Есть ли какие-либо экспериментальные функции, платформы или библиотеки, поддерживающие это?
- Если нет, возможно ли создать личный DoubleArrayList, заменив все объекты в исходном коде ArrayList на примитивный двойной? Каковы потенциальные подводные камни такого подхода?
- У нас очень плотный график, и у нас нет времени переписывать весь пакет на C++, где доступен вектор.
- В нашем случае размер контейнера будет меняться во время вычислений, и мы не знаем размер заранее. Поэтому мы должны использовать массив изменяемого размера (например, ArrayList) вместо double[].
Подробнее здесь: https://stackoverflow.com/questions/788 ... rical-comp