System.arraycopy производительность - PullRequest
0 голосов
/ 19 июня 2019

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

В одном из моих сценариев яхотите сместить ячейки выделенного массива вправо на определенную длину.Для этого я реализую следующее простое решение:

private void shiftRight(int length) {
    for (int index = size + length - 1; index >= length; index--) {
        bytes[index] = bytes[index - length];
    }
}

В процессе поиска этой проблемы в Google я обнаружил, что могу использовать System.arraycopy вместо своего простого решения.

System.arraycopy(bytes, 0, bytes, length, size);

Но меня беспокоит производительность System.arraycopy.Как упомянуто в документации этого метода:

Если аргументы src и dest ссылаются на один и тот же объект массива, то копирование выполняется так, как если бы компоненты в позициях srcPos через srcPos + length-1 былисначала копируется во временный массив с компонентами длины, а затем содержимое временного массива копируется в позиции destPos через destPos + length-1 массива назначения.

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

Не могли бы вы обсудить эти два решения?

Заранее спасибо.

1 Ответ

3 голосов
/ 19 июня 2019

Ключевыми словами в предложении являются «как будто». На самом деле он не использует временный массив. В описании просто говорится, что он работает , как если бы был один (другими словами, он не переписывает то, что не должен).

Вы можете сравнить производительность System.arraycopy с циклом for, поскольку, как мне кажется, я где-то видел, что цикл for может быть быстрее для коротких массивов.

См. Эффективен ли Java System.arraycopy () для небольших массивов?

...