2016-11-01 18 views
0

Например:В Java, эффективна ли память или ускоренная выгода для извлечения внутреннего локального массива снаружи?

while (some_condition) { 
    byte[] myArray = new byte[65536]; 
    ...do some array manipulate... 
    ... 
} 

и

byte[] myArray = new byte[65536]; 
while (some_condition) { 
    ...clear/system.arraycopy the myArray with 0 
    ...then, do some array manipulate... 
    ... 
} 

Что является более эффективной память или скорость преимущества в Java JVM?

И когда цикл глубже, извлечение внутреннего локального массива для внешнего - это уродливо и трудно понять.

+0

Тот, который выделяет меньше памяти (2), явно более эффективен с точки зрения памяти. –

+0

Вы можете сравнить его. – mm759

+0

Я думаю, что в принципе невозможно сказать в изоляции. То, что вы делаете, - ** если ** вы столкнулись с проблемой с методом, в котором он находится, [benchmark] (http://stackoverflow.com/questions/504103/how-do-i-write-a-correct-micro -benchmark-in-java) оба способа определить, разрешает ли одна из них проблема. Я бы, вероятно, интуитивно написал первый, хотя он и нарушает мои обычные «переменные», которые должны быть ограничены как можно точнее ». –

ответ

0

Существует определенное преимущество в количестве создаваемого мусора. При извлечении массива он равен нулю, а массив внутри цикла - O (n). Независимо от того, влияет ли этот факт на общий контекст, зависит от этого контекста. В некоторых случаях лучше отдавать предпочтение простоте, но определенно - это случаи, когда устранение мусора может принести важные преимущества скорости. Еще одним преимуществом повторного использования массива является локализация кэша процессора.

+0

Я не вижу, как приложение получит что-либо из «локальности кеша», когда оно все равно будет перезаписывать содержимое всего массива нулями. – Holger

+0

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

1

В обоих случаях массив будет обнулен, либо явно указан вами (второй случай), либо JVM после выделения (первый случай). Однако в первом случае, поскольку вы распределяете память на каждую итерацию, общее давление памяти будет больше, что может вызвать сбор мусора (в зависимости от того, сколько итераций у вас есть, что еще вы делаете в программе и многих других факторы). Это может замедлить вас по сравнению со вторым случаем.

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

+1

Существует еще один случай, когда лучший пример лучше (кроме лучшей читаемости), а именно, если цикл выполняется в среднем менее одного раза. – Henry