Что такое StubRoutines::jbyte_disjoint_arraycopy
Я измерял какой-то однопоточный вызов метода (написанный на Scala) и хотел проанализировать тест. Вот как это выглядит (детали реализации опущены)
@State(Scope.Benchmark)
class TheBenchmarks {
var data: Array[Byte] = _
@Param(Array("1024", "2048", "4096", "8192"))
var chunkSize: Int = _
@Setup
def setup(): Unit = {
data = //get the data
}
@Benchmark
@OutputTimeUnit(TimeUnit.MICROSECONDS)
@BenchmarkMode(Array(Mode.AverageTime))
def takeFirstAvroRecord(bh: Blackhole): Unit = {
val fr = //do computation with data and chunk size
bh.consume(fr)
}
}
Ладно, я получил какой-то результат и хотел это понять, но вывод -prof perfasm
мне немного непонятно Прежде всего:
....[Hottest Regions]...............................................................................
44.20% 40.50% runtime stub StubRoutines::jbyte_disjoint_arraycopy (205 bytes)
6.78% 1.62% C2, level 4 cats.data.IndexedStateT$$Lambda$21::apply, version 1242 (967 bytes)
4.39% 0.79% C2, level 4 my.pack.age.Mclass::cut0, version 1323 (299 bytes)
а также
....[Hottest Methods (after inlining)]..............................................................
44.20% 40.50% runtime stub StubRoutines::jbyte_disjoint_arraycopy
8.40% 3.93% C2, level 4 cats.data.IndexedStateT$$Lambda$21::apply, version 1242
5.76% 2.67% C2, level 4 my.pack.age.Mclass::cut0, version 1323
Я нашел немного о jbyte_disjoint_arraycopy
, Здесь заявлено следующее следующим образом.
StubRoutines::_jbyte_disjoint_arraycopy = generate_disjoint_byte_copy(false, &entry,
"jbyte_disjoint_arraycopy");
Судя по источнику generate_disjoint_byte_copy
метод это выглядит как вещь генерации ассемблерного кода... Я мог бы догадаться, что это некоторая внутренняя копия массива для x86
...
Вопрос: Можете ли вы дать некоторые объяснения о StubRoutines
и что может сделать его самым жарким регионом?
1 ответ
Вы угадали. <type>_disjoint_arraycopy
заглушки - это функции, сгенерированные во время выполнения специально для ускорения System.arraycopy
звонки.
Когда JVM запускается, он генерирует оптимизированный машинный код для определенных подпрограмм, используя доступные в настоящее время функции ЦП. Например, если процессор поддерживает AVX2, генерируется arraycopy
заглушки будут использовать инструкции AVX2.
System.arraycopy
является внутренним методом HotSpot. При компиляции C2 вызов System.arraycopy
выполняет необходимые проверки, а затем вызывает один из сгенерированных arraycopy
процедуры заглушки.
Если StubRoutines::jbyte_disjoint_arraycopy
это самый жаркий регион, это в основном означает, что ваш тест проводит большую часть времени внутри System.arraycopy
иметь дело с byte[]
массивы. Вы можете попробовать async-profiler, чтобы увидеть, где это arraycopy
называется из.
Это сработало
Вы угадали. Заглушки _disjoint_arraycopy - это функции, созданные во время выполнения специально для ускорения вызовов System.arraycopy.
Когда JVM запускается, она создает оптимизированный машинный код для определенных подпрограмм, используя доступные в настоящее время функции ЦП. Например, если ЦП поддерживает AVX2, сгенерированные заглушки для копирования массива будут использовать инструкции AVX2.
System.arraycopy - это внутренний метод HotSpot. При компиляции C2 вызов System.arraycopy выполняет необходимые проверки, а затем вызывает одну из сгенерированных подпрограмм заглушки копирования массива.
Если StubRoutines::jbyte_disjoint_arraycopy - самая горячая область, это в основном означает, что ваш тест проводит большую часть времени внутри System.arraycopy, работая с массивами byte[]. Вы можете попробовать async-profiler, чтобы узнать, откуда вызывается эта копия массива.