Стоит ли делать константу для пустого массива в Java? [Дубликат]

1

Иногда мне нужно возвращать пустые массивы для выполнения некоторых контрактов классов.

Вместо того, чтобы всегда создавать пустой массив:

@Override public String[] getDescriptionTexts() {
    return new String[0]; // no texts
}

Я думаю, что лучше повторить использование пустого массива из константы:

public class Strings {
    public static final String[] EMPTY_ARRAY = new String[0];
}

@Override public String[] getDescriptionTexts() {
    return Strings.EMPTY_ARRAY; // no texts
}

Стоит ли такая оптимизация?

  • 2
    Нет разницы между двумя кодами с точки зрения производительности. Вы не заметите никакой разницы вообще.
  • 0
    Как насчет выделения памяти?
Показать ещё 2 комментария
Теги:

3 ответа

5
Лучший ответ

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

Поэтому я бы просто пошел за константой.


Быстрый микро-тест показывает, что разница составляет около 1 процессорный цикл с точки зрения производительности (0,3 наносекунды, то есть ничего действительно) и что активность GC выше при создании пустого массива (~ 10 мс на 1000 мс тест или 1% времени в GC).

Benchmark                                       Mode  Samples    Score   Error   Units

c.a.p.SO27167199.constant                       avgt       10    3.165 ± 0.026   ns/op
c.a.p.SO27167199.constant:@gc.count.profiled    avgt       10    0.000 ±   NaN  counts
c.a.p.SO27167199.constant:@gc.count.total       avgt       10    0.000 ±   NaN  counts
c.a.p.SO27167199.constant:@gc.time.profiled     avgt       10    0.000 ±   NaN      ms
c.a.p.SO27167199.constant:@gc.time.total        avgt       10    0.000 ±   NaN      ms

c.a.p.SO27167199.newArray                       avgt       10    3.405 ± 0.051   ns/op
c.a.p.SO27167199.newArray:@gc.count.profiled    avgt       10  250.000 ±   NaN  counts
c.a.p.SO27167199.newArray:@gc.count.total       avgt       10  268.000 ±   NaN  counts
c.a.p.SO27167199.newArray:@gc.time.profiled     avgt       10   95.000 ±   NaN      ms
c.a.p.SO27167199.newArray:@gc.time.total        avgt       10  108.000 ±   NaN      ms
  • 0
    Создание массива каждый раз, когда вам нужно, вызовет дополнительную активность GC, которая может снизить вашу производительность, если приложение работает в течение длительного времени. +1
  • 0
    @AlexR из любопытства Я также проверил влияние ГХ - оно не такое высокое (1% времени процессора), но оно также ничтожно мало.
Показать ещё 1 комментарий
0

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

0

Они не включили много вещей, которые могут быть полезны в JDK. Что относительно EMPTY_STRING? Звучит очень полезно.

Я лично предпочитаю использовать ваш второй подход, то есть определить static final String[] EMPTY = new String[0] а затем использовать его.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню