Является ли реализация Java для FlatBuffer нулевым распределением?

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

После некоторого исследования кажется, что FlatBuffers будет хорошей заменой, поскольку он утверждает, что это нулевое распределение / нулевой синтаксический анализ. Однако тесты производительности были протестированы на C ++. Мое приложение написано на Java. Является ли реализация FlatBuffer быстрой и по-прежнему с нулевым распределением / нулевым синтаксическим анализом на Java?


person user1428945    schedule 25.05.2017    source источник


Ответы (2)


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

Например, объекты доступа, которые являются значениями в C ++ (и C #), являются выделением в Java. Однако их можно повторно использовать в нескольких объектах, поэтому их стоимость может быть низкой, что немного усложняет код.

Хуже всего строки, которые являются UTF-8 в FlatBuffers, но Java не поддерживает UTF-8 напрямую. Поэтому, если вы хотите получить к нему доступ как String, его необходимо преобразовать и выделить. Вы также можете получить к нему доступ как UTF-8 ByteBuffer, но очень мало API, где это полезно.

Однако, если не все части данных используются или используются постепенно, это все равно огромный выигрыш по сравнению с распаковкой / распределением всего сразу.

person Aardappel    schedule 25.05.2017
comment
Возможно, стоит добавить, что современные JVM выполняют escape-анализ и могут выделять объекты в стеке, если объект не выходит из вызывающего кадра стека. Следовательно, повторное использование объектов не обязательно происходит быстрее и может фактически оказаться медленнее из-за увеличения количества промахов в кэше. - person meriton; 28.05.2017

Судя по коде библиотеки, и синтаксический анализ, и объект распределение происходит лениво при доступе к собственности.

Что касается скорости, я не могу себе представить, что это будет значительно медленнее, чем получение данных из базы данных в первую очередь, но не стесняйтесь тестировать это :-)

person meriton    schedule 25.05.2017