Почему System.arraycopy является собственным в Java?

Я был удивлен видеть в источнике Java, что System.arraycopy является собственным методом.

Конечно, причина состоит в том, потому что это быстрее. Но что собственные приемы код в состоянии использовать, которые делают его быстрее?

Почему не только цикл по исходному массиву и копируют каждый указатель на новый массив - конечно, это не, это замедляется и громоздкий?

79
задан polygenelubricants 5 May 2010 в 10:16
поделиться

4 ответа

В родном коде это можно сделать с помощью одной memcpy / memmove, в отличие от n отдельных операций копирования. Разница в производительности существенна.

75
ответ дан 24 November 2019 в 10:18
поделиться

Это не может быть написано на Java. Нативный код способен игнорировать или устранять разницу между массивами Object и массивами примитивов. Java не может этого сделать, по крайней мере, неэффективно.

И его нельзя написать с помощью одной memcpy(), из-за семантики, требуемой перекрывающимися массивами.

15
ответ дан 24 November 2019 в 10:18
поделиться

Это, конечно, зависит от реализации.

HotSpot будет рассматривать его как «внутренний» и вставлять код на сайте вызова. Это машинный код, а не медленный старый код C. Это также означает, что проблемы с сигнатурой метода в значительной степени исчезнут.

Простой цикл копирования достаточно прост, чтобы к нему можно было применить очевидные оптимизации. Например, разворачивание цикла. То, что происходит в точности, снова зависит от реализации.

9
ответ дан 24 November 2019 в 10:18
поделиться

Есть несколько причин:

  1. JIT вряд ли сгенерирует такой же эффективный код низкого уровня, как написанный вручную код C. Использование низкоуровневого C может обеспечить множество оптимизаций, которые практически невозможно сделать для обычного JIT-компилятора.

    См. Эту ссылку для некоторых приемов и сравнения скорости написанных вручную реализаций C (memcpy, но принцип тот же): Проверьте это Оптимизация Memcpy увеличивает скорость

  2. Версия C в значительной степени не зависит от типа и размер членов массива. Невозможно сделать то же самое в java, поскольку нет способа получить содержимое массива в виде необработанного блока памяти (например, указателя).

3
ответ дан 24 November 2019 в 10:18
поделиться
Другие вопросы по тегам:

Похожие вопросы: