Что такое StubRoutines :: jbyte_disjoint_arraycopy - PullRequest
0 голосов
/ 13 сентября 2018

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

0 голосов
/ 14 сентября 2018

Вы правильно догадались. <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.

...