Comments 13
Это шаг №0 и я его неявно подразумеваю.
System.arraycopy — довольно сложная штука и по одному тесту я бы вывод не делал. Например, если массивы разных типов (копируем из Object[]
в String[]
), то она вставит проверку типа каждого элемента, ни о какой векторизации речи не идёт. Зато, например, при копировании из String[]
в CharSequence[]
проверка типов пропадёт. Кроме того, если вы копируете какой-то диапазон элементов и статически не определяется, что выход за границы не происходит, для arraycopy совершенно точно проверка границ будет снаружи цикла. А вот удастся ли JIT-компилятору вынести её наружу из ручного цикла — я не уверен на 100%. В общем, я бы не стал всегда полагаться, что ручное копирование будет так же эффективно.
Вообще сам код интринсика в C2 вот он. Там 200 строк основного метода и это только верхушка айсберга, он вызывает ещё кучу вспомогательных. Можете посмотреть, сколько там разных веток и случаев.
arrayCopy
для long[]
вырождается в такую простыню (для x86) — и вот их оптимизировать это скорее гадание на кофейной гуще — что лучше сработает векторизация, или intrinsic.Optimize empty HashMap and ArrayList коммит в openjdk
и тут же откатили
открыл щас JDK 1.8.0.121
/**
* Shared empty array instance used for default sized empty instances. We
* distinguish this from EMPTY_ELEMENTDATA to know how much to inflate when
* first element is added.
*/
private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA = {};
/**
* Constructs an empty list with an initial capacity of ten.
*/
public ArrayList() {
this.elementData = DEFAULTCAPACITY_EMPTY_ELEMENTDATA;
}
А вот и устаревшие внутри-JDK-шные советы по оптимизации правят:
- // (3)getClass().getClassLoader0() is expensive
- // (4)There might be a timing gap in isTrusted setting. getClassLoader0()
+ // (3)There might be a timing gap in isTrusted setting. getClassLoader0()
Performance это праздник