Java 7 String – сложность подстроки

До Java 6 у нас была постоянная подстрока времени на String . В Java 7 почему они решили пойти с копированием массива char и унизиться до линейной временной сложности – когда для этого было что-то вроде StringBuilder ?

Почему они решили обсудить в Oracle ошибка # 4513622: (str) сохранение подстроки поля предотвращает GC для объекта :

Когда вы вызываете String.substring, как в примере, новый массив символов для хранения не выделяется. Он использует массив символов исходной строки. Таким образом, массив символов, поддерживающий исходную строку, не может быть GC’d, пока ссылки подстроки также не будут GC’d. Это преднамеренная оптимизация для предотвращения чрезмерных распределений при использовании подстроки в общих сценариях. К сожалению, проблемный код попадает в случай, когда заметные издержки исходного массива заметны. Трудно оптимизировать для обоих случаев краев. Любая оптимизация для компромиссов пространства / размера обычно сложна и часто может быть специфичной для платформы.

Это также примечание , отметив, что однажды оптимизация стала пессимизацией в соответствии с тестами:

В течение длительного времени были подготовлены и строганы для удаления полей смещения и подсчета из java.lang.String. Эти два поля позволяют нескольким экземплярам String совместно использовать один и тот же базовый буфер символов. Общие буферы символов были важной оптимизацией для старых тестов, но с текущим кодом реального мира и эталонами, на самом деле лучше не делиться вспомогательными буферами. Общий буфер массива поддерживает только «выигрыш» с очень интенсивным использованием String.substring. В ситуации с негативным воздействием могут присутствовать синтаксические анализаторы и компиляторы, однако текущее тестирование показывает, что в целом это изменение выгодно.

Если у вас длинная маленькая подстрока короткой, большой родительской строки, большой символ [], поддерживающий родительскую строку, не будет иметь права на garbage collection, пока малая подстрока не выйдет из сферы действия. Это означает, что подстрока может занимать гораздо больше памяти, чем люди ожидают.

Единственный раз, когда метод Java 6 выполнялся значительно лучше, когда кто-то взял большую подстроку из большой родительской строки, что очень редко.

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

Это повлияет на сложность структур данных, таких как массивы суффикса, с достаточной долей. Java должен предоставить альтернативный метод для получения части исходной строки.

Это просто их дерьмовый способ исправить некоторые ограничения на garbage collection JVM.

Перед Java 7, если мы хотим избежать проблемы с сборкой мусора, мы всегда можем скопировать подстроку вместо сохранения ссылки подстроки. Это был просто дополнительный вызов конструктору копирования:

 String smallStr = new String(largeStr.substring(0,2)); 

Но теперь у нас больше нет подстроки времени. Какая катастрофа.

Я считаю, что главной мотивацией является возможное «совместное размещение» String и его char[] . Прямо сейчас они располагаются на расстоянии, что является серьезным штрафом в строках кэша. Если каждому String принадлежит свой char[] , JVM может объединить их вместе, и чтение будет намного быстрее.

  • Ошибка компилятора: ссылка на вызов неоднозначную
  • Отправка электронной почты с помощью JSP
  • Исключение в streamе «main» java.lang.UnsupportedClassVersionError: a (Unsupported major.minor version 51.0)
  • Вывод общего типа не работает с цепочкой методов?
  • Как использовать JDK 7 на Mac OSX?
  • Невозможно создать прозрачный и незадекларированный JFrame в JDK7 при включении nimbus
  • Различия в автоматическом распаковке между Java 6 и Java 7
  • Знак подчеркивания Java 7 в числовых литералах
  • Поддержка сжатия сжатых строк в JSM HotSpot?
  • Java-язык с поддержкой Android
  • java.security.cert.CertificateException: сертификаты не соответствуют ограничениям алгоритма
  • Давайте будем гением компьютера.