Оптимизация Java Array Copy

1

Поэтому для моей исследовательской группы я пытаюсь преобразовать какой-то старый C++ код в Java, и я столкнулся с проблемой, когда в коде C++ он делает следующее:

    method(array+i, other parameters)

Теперь я знаю, что Java не поддерживает арифметику указателей, поэтому я обошел это, скопировав подмашину из массива + я в конец массива в новый массив, но это приводит к тому, что код работает очень медленно (т.е. в 100 раз медленнее, чем [ CN10]). Есть ли способ обойти это? Я видел, как кто-то упоминал о встроенном методе здесь, но так ли это быстрее?

  • 1
    Вы используете System.arraycopy() ?
  • 0
    Нет, я только что вручную скопировал подмассив в новый. Является ли System.arraycopy () значительно быстрее?
Показать ещё 2 комментария
Теги:
arrays

4 ответа

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

Мало того, что ваш код становится медленнее, он также изменяет семантику того, что происходит: когда вы делаете вызов в C++, копирование массива не выполняется, поэтому любое изменение method может применяться к массиву в оригинале, а не в отбрасываемой копии.

Чтобы добиться такого же эффекта в Java, измените подпись вашей функции следующим образом:

void method(array, offset, other parameters)

Теперь вызывающий должен передать позицию в массиве, чтобы method рассматривал "виртуальный нуль" массива. Другими словами, вместо того, чтобы писать что-то вроде

for (int i = 0 ; i != N ; i++)
    ...

вам придется писать

for (int i = offset ; i != offset+N ; i++)
    ...

Это сохранит семантику C++ передачи массива в функцию-член.

2

Функция C++, вероятно, полагалась на обработку с начала array. В Java он должен быть настроен на запуск из смещения в массив, поэтому массив не нужно копировать. Копирование массива, даже с помощью System.arraycopy, займет значительное количество времени.

Его можно определить как метод Java с чем-то вроде этого:

void method(<somearraytype> array, int offset, other parameters)

Затем метод начнет со смещения в массив, и он будет называться примерно так:

method(array, i, other parameters);
0

Правильный способ справиться с этим - реорганизовать метод, подписать

method(int[] array, int i, other parameters)

так что вы передаете весь массив (по ссылке), а затем передаете метод, откуда начать его обработку. Тогда вам не нужно делать никаких копий.

0

Если вы хотите передать подматрицу методу, альтернативой копированию подматрицы в новый массив будет передача всего массива с дополнительным параметром offset который указывает первый соответствующий индекс массива. Это потребует изменений в реализации method, но если производительность является проблемой, это, вероятно, самый эффективный способ.

Ещё вопросы

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