Поэтому для моей исследовательской группы я пытаюсь преобразовать какой-то старый C++ код в Java, и я столкнулся с проблемой, когда в коде C++ он делает следующее:
method(array+i, other parameters)
Теперь я знаю, что Java не поддерживает арифметику указателей, поэтому я обошел это, скопировав подмашину из массива + я в конец массива в новый массив, но это приводит к тому, что код работает очень медленно (т.е. в 100 раз медленнее, чем [ CN10]). Есть ли способ обойти это? Я видел, как кто-то упоминал о встроенном методе здесь, но так ли это быстрее?
Мало того, что ваш код становится медленнее, он также изменяет семантику того, что происходит: когда вы делаете вызов в 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++ передачи массива в функцию-член.
Функция C++, вероятно, полагалась на обработку с начала array
. В Java он должен быть настроен на запуск из смещения в массив, поэтому массив не нужно копировать. Копирование массива, даже с помощью System.arraycopy
, займет значительное количество времени.
Его можно определить как метод Java с чем-то вроде этого:
void method(<somearraytype> array, int offset, other parameters)
Затем метод начнет со смещения в массив, и он будет называться примерно так:
method(array, i, other parameters);
Правильный способ справиться с этим - реорганизовать метод, подписать
method(int[] array, int i, other parameters)
так что вы передаете весь массив (по ссылке), а затем передаете метод, откуда начать его обработку. Тогда вам не нужно делать никаких копий.
Если вы хотите передать подматрицу методу, альтернативой копированию подматрицы в новый массив будет передача всего массива с дополнительным параметром offset
который указывает первый соответствующий индекс массива. Это потребует изменений в реализации method
, но если производительность является проблемой, это, вероятно, самый эффективный способ.
System.arraycopy()
?