Мой вопрос: как лучше всего избежать упомянутых накладных расходов? Я не понимаю, почему мой вопрос был закрыт по причине: «Этот вопрос должен быть более сфокусированным».
Сейчас я работаю над численными вычислениями в конкретном исследовании. домен и унаследовали пакет 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 на примитивный двойной? Каковы потенциальные подводные камни такого подхода?
PS:
У нас очень плотный график, и у нас нет времени переписывать весь пакет на C++, где доступен вектор.
В нашем случае размер контейнера будет меняться во время вычислений, и мы не знаем размер заранее. Поэтому мы должны использовать массив изменяемого размера (например, ArrayList) вместо double[].
[b]Мой вопрос: как лучше всего избежать упомянутых накладных расходов? Я не понимаю, почему мой вопрос был закрыт по причине: «Этот вопрос должен быть более сфокусированным».[/b] Сейчас я работаю над численными вычислениями в конкретном исследовании. домен и унаследовали пакет Java, давно реализованный моей командой. Моя задача сейчас — оптимизировать его работу. В пакете широко используется ArrayList. Насколько мне известно, Java, по крайней мере до версии 9, которую я использую, не поддерживает ArrayList примитивных типов из-за стирания типов в дженериках Java. Там Есть несколько проблем: [list] [*]Накладные расходы на хранение: Double — это класс-оболочка для double. Поскольку Double является объектом, он включает заголовок объекта, который занимает 8 байт. Таким образом, каждый объект Double занимает 16 байт памяти.
[*]Несмежная память: ArrayList внутренне использует массив для хранения Объекты Double, т. е. данные Double[]. Этот массив содержит ссылки на экземпляры Double. Эти экземпляры не хранятся в куче подряд. Например, если Double[] data = {1.0, 2.0, ссылки в данных являются смежными, но фактические объекты Double, на которые указывают эти ссылки, — нет. Это приводит к плохой локализации и частым промахам в кэше из-за необходимости разыменования этих указателей.
[*]Распаковка и автоупаковка: возникают дополнительные издержки из-за распаковка и автоупаковка при выполнении сравнений и вычислений с помощью Double.
[/list] Мои вопросы: Каковы наилучшие способы избежать упомянутых накладных расходов? Я приветствую любые ответы на приведенные ниже вопросы. [list] [*]Есть ли в последних версиях Java какие-либо новые функции, позволяющие использовать ArrayList с примитивными типами ?
[*]Есть ли какие-либо экспериментальные функции, платформы или библиотеки, поддерживающие это? [*]Если нет, возможно ли создать личный DoubleArrayList, заменив все объекты в исходном коде ArrayList на примитивный двойной? Каковы потенциальные подводные камни такого подхода?
[/list] PS: [list] [*]У нас очень плотный график, и у нас нет времени переписывать весь пакет на C++, где доступен вектор.
[*]В нашем случае размер контейнера будет меняться во время вычислений, и мы не знаем размер заранее. Поэтому мы должны использовать массив изменяемого размера (например, ArrayList) вместо double[].
Мой вопрос: как лучше всего избежать упомянутых накладных расходов? Я не понимаю, почему мой вопрос был закрыт по причине: «Этот вопрос должен быть более сфокусированным».
Сейчас я работаю над численными вычислениями в конкретном исследовании....
Мой вопрос: как лучше всего избежать упомянутых накладных расходов? Я не понимаю, почему мой вопрос был закрыт по причине: «Этот вопрос должен быть более сфокусированным».
Сейчас я работаю над численными вычислениями в конкретном исследовании....
Мой вопрос: как лучше всего избежать упомянутых накладных расходов? Я не понимаю, почему мой вопрос был закрыт по причине: «Этот вопрос должен быть более сфокусированным».
Сейчас я работаю над численными вычислениями в конкретном исследовании....
Сначала я присвоил большое значение целочисленной переменной (большее число, чем диапазон байтов data_type). Затем я создал байтовую переменную и попытался ввести значение первой переменной....
Я сделал некоторое профилирование в своем приложении, и один из результатов оказался, что около 18% памяти в куче используется объектами типа двойной . Оказывается, эти объекты являются значениями в карте s, где я не могу использовать примитивный...