Для массивов до 10 элементов: для копирования цикла или System.arrayCopy? - PullRequest
2 голосов
/ 24 января 2012

Если предположить, что в Java 10 или менее элементов Object [], какой будет самый быстрый способ копирования массива?

  1. for(int i = 0;i < a.length;i++)
    
  2. for(int i = 0,l = a.length;i < l;i++) // i.e. is caching array len in local var faster?
    
  3. System.arrayCopy(a, 0, a2, 0, a.length);
    

Ответы [ 4 ]

5 голосов
/ 24 января 2012
  1. Скорее всего, разница между тремя альтернативами относительно невелика.

  2. Скорее всего, это не имеет отношения к общей производительности вашего приложения.

  3. Относительная разница, вероятно, зависит от аппаратной платформы и используемой вами реализации Java.

  4. Относительная разница также зависит отзаявленные и действительные типы массивов.

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

4 голосов
/ 24 января 2012

Кэширование длины не полезно.Вы получаете доступ к полю напрямую.И даже если бы это был метод, JIT включил бы и оптимизировал бы его.

Если бы что-то было оптимизировано, System.arraycopy содержало бы оптимизацию.

Но реальный ответ - то, что этоне имеет значения вообще.Вы не получите значительного прироста производительности, выбрав наиболее подходящий способ копирования массива из 10 элементов или менее.Если у вас есть проблема с производительностью, то найдите, откуда она берется, измерив, а затем оптимизируйте то, что должно быть оптимизировано.В остальном, используйте то, что является наиболее читабельным и обслуживаемым.То, что вы делаете, это преждевременная оптимизация.И это корень всего зла (говорит Д. Кнут).

2 голосов
/ 24 января 2012

System.arraycopy () - это самый быстрый способ скопировать массив - так как он разработан и оптимизирован именно для этой задачи.Ходили слухи, что для небольших массивов он может иметь более быстрый кодированный цикл, но пока это не так.System.arraycopy является свойством JIT, и JIT выбирает наилучшую реализацию для каждого случая.

0 голосов
/ 24 января 2012

Получите книгу о внутренностях JVM (например, «Oracle JRockit, The Definitive Guide») и поймите, что то, что выполняет JVM, после прогрева, развертывания цикла, встраивания метода, перераспределения регистров, извлечения инварианта циклаи так далее даже близко не будет напоминать то, что вы пишете в исходном коде Java.

Извините :-) В противном случае вам понравится http://www.javaspecialists.eu.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...