2015-10-20 3 views
0

С помощью этого метода:оптимизация памяти пустой переменной длины

public void args(Class... methodArgsTypes) { 
     if (methodArgsTypes.length == 0) { 
      methodArgsTypes = NO_PARAMETERS; // public static Class[0] array 
     } 
     this.methodArgsTypes = methodArgsTypes; 
    } 

когда метод вызывается без аргументов args(), то Class[0] создается. Поскольку значение methodArgsTypes сохраняется в течение всего срока действия приложения (когда вы удаляете блок if выше), имеет ли смысл иметь блок if, как указано выше? Целью этого является предотвращение создания большого количества пустых массивов в памяти и сохранение ссылки только на один публичный статический пустой массив. Следовательно, меньше памяти.

Будет ли это иметь смысл?

+0

Сколько из этих массивов нулевой длины создано во время жизни приложения? – wero

+0

Это может быть много. Большинство методов не содержат аргументов, которые сканируются в этом прецеденте. – igr

+0

Трудно сказать общий эффект без бенчмаркинга и измерения. К счастью для вас, это буквально трехстрочное изменение - почему бы просто не попробовать и не посмотреть? Кроме того, если вы вызываете это действительно как vararg (а не с явным 'Class []', который вы передаете vararg), вы можете создать простую перегрузку, которая использует NO_PARAMTERS const: 'public void args() { Args (NO_PARAMETERS); } '. – yshavit

ответ

0

Нет, из-за 2 причины: 1) пустой массив довольно мал, и он умрет почти мгновенно, так что это не окажет существенного влияния на ваше поведение памяти 2) точно в срок компилятор, скорее всего, оптимизирует его в любом случае из-за его агрессивной инлайн-оптимизации.

+0

Hm, 1) неверно, так как он назначается локальной переменной, хранящейся в течение жизненного цикла приложения (что происходит, если вы удаляете блок 'if'). Для 2), вы знаете это точно? Как я могу измерить? – igr

+0

1) действительно верно, потому что если вы не сделаете свою оптимизацию, для каждого вызова будет выделен массив из 24 байтов на 64-битных машинах, который умирает, когда метод вернется не позднее. И я думаю, что 24 байта до тех пор, пока метод активен, можно терпеть! Для 2) это сложно, оптимизация называется «анализ утечки и скалярная замена» и реализуется в текущем компиляторе Hotspot JIT. Вероятно, вы можете узнать, глядя на флаги трассировки виртуальной машины и попытаться выяснить, действительно ли метод вложен. – loonytune

Смежные вопросы