При попытке настроить производительность нашего конвейера синтаксического анализа/проверки/привязки Java XML я заметил следующее:
Итерация символов строки через String.charAt() выполняется медленно, см. например Вудстокс (мне удалось проверить это утверждение с помощью собственных тестов):
Промежуточный буфер, в который можно скопировать символы строки в тех случаях, когда такое копирование с последующим доступом к массиву происходит быстрее, чем вызов String.charAt() (что, возможно, на удивление часто случается и особенно важно для более длинных буферов).
Копирование в буферный массив с помощью String.getChars() и затем итерация буфера, очевидно, обходится дороже, чем просто итерация по массиву.
Библиотеки с высокой оптимизацией производительности, такие как FastJSON, используют смесь небезопасных, устаревших и недокументированных API-интерфейсов (AFAIU) для прямого доступа к резервному массиву String (я проверил с помощью собственных тестов, что этот подход имеет преимущества в производительности)
Знаете ли вы о каких-либо планах «официально» предложить API для прямого доступа к резервному массиву String? Обновление от 23 ноября 2025 г.:
Отредактирован вопрос, чтобы сделать его более кратким, удалены некоторые предположения, почему все работает так, как работает
Несколько комментаторов упомянули, что обещание неизменяемости String мешает прямому доступу к резервному массиву. Интересной идеей в этом аспекте могут быть замороженные массивы. Хотя на первый взгляд JEP выглядит устаревшим и мертвым, Брайан Гетц упомянул Frozen Arrays как желательную функцию еще в этом году (2025 г.).
При попытке настроить производительность нашего конвейера синтаксического анализа/проверки/привязки Java XML я заметил следующее: [list] [*]Итерация символов строки через String.charAt() выполняется медленно, см. например Вудстокс (мне удалось проверить это утверждение с помощью собственных тестов): [/list]
Промежуточный буфер, в который можно скопировать символы строки в тех случаях, когда такое копирование с последующим доступом к массиву происходит быстрее, чем вызов String.charAt() (что, возможно, на удивление часто случается и особенно важно для более длинных буферов).
[list] [*]Копирование в буферный массив с помощью String.getChars() и затем итерация буфера, очевидно, обходится дороже, чем просто итерация по массиву. [*]Библиотеки с высокой оптимизацией производительности, такие как FastJSON, используют смесь небезопасных, устаревших и недокументированных API-интерфейсов (AFAIU) для прямого доступа к резервному массиву String (я проверил с помощью собственных тестов, что этот подход имеет преимущества в производительности) [/list] Знаете ли вы о каких-либо планах «официально» предложить API для прямого доступа к резервному массиву String? [b]Обновление от 23 ноября 2025 г.:[/b] [list] [*]Отредактирован вопрос, чтобы сделать его более кратким, удалены некоторые предположения, почему все работает так, как работает [/list] [b]Возможные ответы на данный момент[/b] [list] [*]Это не лучшее место для вопросов, архитекторы языка Java активны на https://langdev.stackexchange.com/ [*]Несколько комментаторов упомянули, что обещание неизменяемости String мешает прямому доступу к резервному массиву. Интересной идеей в этом аспекте могут быть замороженные массивы. Хотя на первый взгляд JEP выглядит устаревшим и мертвым, Брайан Гетц упомянул Frozen Arrays как желательную функцию еще в этом году (2025 г.). [/list]