Я был удивлен видеть в источнике Java, что System.arraycopy является собственным методом.
Конечно, причина состоит в том, потому что это быстрее. Но что собственные приемы код в состоянии использовать, которые делают его быстрее?
Почему не только цикл по исходному массиву и копируют каждый указатель на новый массив - конечно, это не, это замедляется и громоздкий?
В родном коде это можно сделать с помощью одной memcpy
/ memmove
, в отличие от n отдельных операций копирования. Разница в производительности существенна.
Это не может быть написано на Java. Нативный код способен игнорировать или устранять разницу между массивами Object и массивами примитивов. Java не может этого сделать, по крайней мере, неэффективно.
И его нельзя написать с помощью одной memcpy()
, из-за семантики, требуемой перекрывающимися массивами.
Это, конечно, зависит от реализации.
HotSpot будет рассматривать его как «внутренний» и вставлять код на сайте вызова. Это машинный код, а не медленный старый код C. Это также означает, что проблемы с сигнатурой метода в значительной степени исчезнут.
Простой цикл копирования достаточно прост, чтобы к нему можно было применить очевидные оптимизации. Например, разворачивание цикла. То, что происходит в точности, снова зависит от реализации.
Есть несколько причин:
JIT вряд ли сгенерирует такой же эффективный код низкого уровня, как написанный вручную код C. Использование низкоуровневого C может обеспечить множество оптимизаций, которые практически невозможно сделать для обычного JIT-компилятора.
См. Эту ссылку для некоторых приемов и сравнения скорости написанных вручную реализаций C (memcpy, но принцип тот же): Проверьте это Оптимизация Memcpy увеличивает скорость
Версия C в значительной степени не зависит от типа и размер членов массива. Невозможно сделать то же самое в java, поскольку нет способа получить содержимое массива в виде необработанного блока памяти (например, указателя).