1

Строковые константы времени компиляции (интернализированные строки) и литералы можно сравнить с символом ==, поскольку им присваивается одна и та же ссылка во время компиляции, если они как-то равны.Значительно ли строковые константы/литералы в коде замедляются?

Означает ли это, что для компиляции кода, состоящего из n строковых литералов, требуется n log (n) времени для компиляции?

Я задаю этот вопрос здесь, потому что кто-то может уже знать ответ, и я не уверен, что могу написать тест, который измеряет эффект надежным, воспроизводимым или значимым способом. Или что этот тест будет отражать сдерживающие факторы реального мира и т. Д.

Я собираюсь опубликовать любые тестовые примеры, которые я могу придумать, но не стесняйтесь предлагать некоторые из них, я буду реализовывать их, как только смогу найти время ,

+1

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

+1

Почему время компиляции было бы разницей здесь? Сравнение все еще происходит во время выполнения. –

+0

Это просто хорошая догадка, но я думаю, что строковые литералы, такие как '' this '', просто занимают пространство и потребляют время чтения и записи на диске, но строковые константы, такие как' final String s = «Something»; 'будут потреблять некоторые время компиляции тоже, и если слишком много с большим количеством вариантов использования, это повлияет на время компиляции. –

ответ

1

Должны ли строковые константы/литералы в коде замедлять компиляцию?

Номер

Строка компиляции константы времени (усвоенные-строки) и литералов можно сравнить с ==, так как они присвоены те же ссылочные во время компиляции, если они равны или иначе.

Нет, они не являются. Они равны пул во время компиляции в область констант файла .class, и они интернированы при времени загрузки класса, когда задана ссылка.

Означает ли это, что для компиляции кода, состоящего из n строковых литералов, требуется n log (n) времени для компиляции?

Нет. Там нет изначально O (N журнал (N)) процесса здесь. Объединение O (1) через хеш-таблицу в любой разумной реализации, а также интернирование.

[Это, конечно, будет возможной построить компилятор или intern() метод, который был O (N журнал (N)) или O (N^3) или хуже, но это не так в результате чего-либо в вашем вопросе.]

+0

@HopefullyHelpful Каждая строка * * хранится в хэш-таблице во время компиляции. Или вы спрашиваете о времени выполнения? – EJP

+1

Итак, вы * спрашиваете о времени выполнения? Это помогает ответить на заданные вами вопросы. Вы должны учитывать космические расходы, а также затраты времени. Пул строк runtime не собирался собирать мусор до где-то вокруг Java 1.3, поэтому до тех пор это было бы огромной пустой тратой пространства, следовательно, дизайн 'intern()'. Половина объектов в большинстве исполняемых программ Java - это массивы символов и строки, содержащие их. – EJP

+0

Да, в любой разумной реализации, как я уже сказал в своем ответе. – EJP