Как я могу быстро получить
количество второстепенных коллекций? Я попробовал это ...
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, подобные этой .
Что я могу сделать, чтобы исправить ситуацию?
Надеюсь, что в какой-то будущей версии ocaml добавится что-то вроде Gc.get_minor_free
(добавлено с 4.03.0
), что аналогично крошечной функции для подражателей хакеров GC, таких как я:)
Или я должен копаться во внутреннем IL, который ocamlopt
использует?
Или flambda
может мне помочь? Ответы RTFM в порядке:)
Заранее спасибо за идеи / предложения / фрагменты кода!
1: clang
испускает movq _caml_stat_minor_collections@GOTPCREL(%rip), %rax
.