Что такое 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) Что такое подпрограмма-заглушка и как она работает. 2) В чем проблема с дизассемблером Hotspot. Не уверен, на какой из них ответить - задавайте по одному вопросу в каждом посте.

apangin 13.09.2018 22:39

@apangin Нерелевантная часть удалена.

St.Antario 14.09.2018 00:29
0
2
1 265
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

Вы угадали. Заглушки <type>_disjoint_arraycopy - это функции, созданные во время выполнения специально для ускорения вызовов System.arraycopy.

Когда JVM запускается, она создает оптимизированный машинный код для определенных подпрограмм, используя доступный в настоящее время Особенности процессора. Например. если ЦП поддерживает AVX2, сгенерированные заглушки arraycopy будут использовать инструкции AVX2.

System.arraycopy - это внутренний метод HotSpot. При компиляции C2 вызов System.arraycopy выполняет необходимые проверки, а затем вызывает одну из сгенерированных подпрограмм заглушки arraycopy.

Если StubRoutines::jbyte_disjoint_arraycopy является самым горячим регионом, это в основном означает, что ваш тест большую часть времени проводит внутри System.arraycopy, имея дело с массивами byte[]. Вы можете попробовать асинхронный профилировщик, чтобы узнать, откуда вызывается этот arraycopy.

Можете ли вы получить представление о том, как выполняется эта проверка функций? Я просмотрел generate_disjoint_byte_copy и не заметил каких-либо инструкций / регистров, связанных с AVX2. Может, где-нибудь в другом месте ...?

St.Antario 14.09.2018 02:27

@ St.Antario Обновил ответ со ссылками на использование VM_Version::get_processor_features() и AVX2.

apangin 14.09.2018 09:46

Теперь я вижу. Большое спасибо.

St.Antario 14.09.2018 12:54

Это сработало

Вы угадали. Заглушки _disjoint_arraycopy - это функции, созданные во время выполнения специально для ускорения вызовов System.arraycopy.

Когда JVM запускается, она создает оптимизированный машинный код для определенных подпрограмм, используя доступные в настоящее время функции ЦП. Например. если ЦП поддерживает AVX2, сгенерированные заглушки для копирования массива будут использовать инструкции AVX2.

System.arraycopy - это внутренний метод HotSpot. При компиляции C2 вызов System.arraycopy выполняет необходимые проверки, а затем вызывает одну из сгенерированных подпрограмм заглушки копирования массива.

Если StubRoutines :: jbyte_disjoint_arraycopy - самая горячая область, это в основном означает, что ваш тест проводит большую часть времени внутри System.arraycopy, работая с массивами byte []. Вы можете попробовать async-profiler, чтобы узнать, откуда вызывается эта копия массива.

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