Я измерял некоторый однопоточный вызов метода (написанный на 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
и что может стать причиной того, что он является самым жарким регионом?