Являются ли неконечные статические строки более эффективными, чем статические финальные строки?

Я только что прочитал статью в документации BlackBerry о написании эффективного кода на J2ME.

В этой статье есть раздел, в котором рекомендуется «использовать статические переменные для строк». Причина в том, что, поскольку компилятор встраивает ссылки static final как строковые литералы, лучше оставить их неокончательными (я полагаю, что получение статической ссылки дешевле, чем получение из пула строк?).

Это верно для всех JVM?? Мой босс на моей последней работе вбил нам в голову, что мы должны всегда, всегда использовать static final для наших констант. Мы занимались встроенным программированием на Java, поэтому он был настоящим сторонником производительности (хотя в данном случае я не уверен, что его больше заботило — память или скорость). Мой босс много лет занимается Java и действительно знает свое дело, поэтому я последовал его совету; теперь я получаю противоречивые советы!

Так какой из них действительно лучше? Вы можете ответить либо с точки зрения экономии памяти, либо с точки зрения скорости, а также для J2ME или J2SE.


person Neil Traft    schedule 23.11.2010    source источник
comment
Вероятно, вам следует использовать статический финал. Пусть машина делает то, что она делает, чтобы определить, нужно ли что-то встроить. Кроме того, если вы беспокоитесь о производительности встраивания строки по сравнению с ее вызовом, java, вероятно, не является подходящим языком для работы.   -  person Falmarri    schedule 24.11.2010
comment
Когда вы программируете пользовательский интерфейс для Android или BlackBerry, у вас нет выбора языков. Но помимо этого всегда лучше знать, что происходит под капотом! Да ладно, чувак, это дело принципа! Вы не подчиняетесь машинам, машины подчиняются вам! Кроме того, почему это комментарий, а не ответ?   -  person Neil Traft    schedule 24.11.2010
comment
Это правда, что у вас нет выбора в таких вещах, как Android, но встраивание строк НАМНОГО не является узким местом, это 60 других приложений, работающих в фоновом режиме. Кроме того, конечно, лучше знать, что происходит под капотом, но с такими языками, как java, вы действительно не можете этого сделать, поскольку виртуальная машина должна делать с кодом то, что она хочет.   -  person Falmarri    schedule 24.11.2010
comment
Ну, тогда ответ таков: это будет варьироваться в зависимости от JVM. Нет конкретного способа узнать, что лучше. Тем не менее, я не так уверен. Стажировка строк — это довольно базовая часть любой реализации JVM, поэтому я чувствую, что если мы знаем, что лучше всего работает на одной JVM, это, вероятно, применимо ко всем им.   -  person Neil Traft    schedule 24.11.2010


Ответы (1)


В целом они должны быть одинаковыми. (Если то же самое определено как достаточно близкое, это никогда не будет иметь значения)

Я очень сильно утверждаю, что вы должны закодировать свое намерение (т.е. иметь статическую или нестатическую принадлежность, определяемую тем, является ли это константой класса или константой экземпляра), а не чем какое-то произвольное "повышение производительности"

Если вы обнаружите, что это серьезная проблема с производительностью (и только ПОСЛЕ того, как вы ее измерите!), я бы классифицировал ее как дефект компилятора/JVM и применил обходной путь (замена его статичности) с комментарием, указывающим, почему.

person Steven Schlansker    schedule 24.11.2010
comment
Я не меняю статичность, я меняю завершенность. И обычно я согласен с вами, что разница незначительна, но, с другой стороны, один парень из RIM говорит, что это не так. У вас 7000+ баллов по SO, но этот парень, возможно, является соавтором самой VM. Кому я должен верить? - person Neil Traft; 24.11.2010
comment
Ответ: Я должен верить бенчмарку и только бенчмарку. Да, я знаю. Но речь не идет о конкретном приросте производительности. Речь идет о выборе стиля программирования, который вся моя команда сможет использовать в будущем. Мне не нужно было бы запускать тесты, если бы я мог взвесить плюсы и минусы обоих методов и выбрать один на основе этого... - person Neil Traft; 24.11.2010
comment
@Neil Traft: Вы не должны судить о моем ответе, основываясь на моем представителе :) Тем не менее, очень легко повысить производительность на основе устаревшей информации. Когда выйдет следующий релиз и исправит медлительность их компилятора/VM, возможно, прирост производительности изменится! Ты никогда не узнаешь. Вот почему я говорю, что вы должны измерить его, чтобы увидеть, не слишком ли он медленный, прежде чем даже думать об этом. - person Steven Schlansker; 24.11.2010