Что такое 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, чтобы узнать, откуда вызывается эта копия массива.

Другие вопросы по тегам