Доступ к незначительной информации GC OCaml в узком цикле - PullRequest
0 голосов
/ 26 апреля 2019

Как я могу быстро получить количество второстепенных коллекций? Я попробовал это ...

let get_minor_collection_count () =
  let stat = Gc.quick_stat ()
  in stat.minor_collections

... но код ассемблера X64, выдаваемый ocamlopt версией 4.07.1, выглядит следующим образом:

_camlDemouser2__get_minor_collection_count_2666:
    subq    $8, %rsp
    movq    $1, %rdi
    movq    _caml_gc_quick_stat@GOTPCREL(%rip), %rax
<b>    call    _caml_c_call</b>
    movq    _caml_young_ptr@GOTPCREL(%rip), %r11
    movq    (%r11), %r15
    movq    24(%rax), %rax
    addq    $8, %rsp
    ret

Если я использую код C для доступа к caml_stat_minor_collections, сам доступ быстрый 1 , но необходимость использования _caml_c_call сопряжена с относительно высокими затратами на крошечные функции C, подобные этой .

Что я могу сделать, чтобы исправить ситуацию?

  1. Надеюсь, что в какой-то будущей версии ocaml добавится что-то вроде Gc.get_minor_free (добавлено с 4.03.0), что аналогично крошечной функции для подражателей хакеров GC, таких как я:)

  2. Или я должен копаться во внутреннем IL, который ocamlopt использует?

  3. Или flambda может мне помочь? Ответы RTFM в порядке:)

Заранее спасибо за идеи / предложения / фрагменты кода!


1: clang испускает movq _caml_stat_minor_collections@GOTPCREL(%rip), %rax.

...