微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

保持紧密的无分配循环可中断

如何解决保持紧密的无分配循环可中断

我想保持一个可中断的无分配循环。

为此,我在循环中添加一个虚拟分配。

我的问题是关于最小化分配成本。

这是我正在做的最小版本:

let my_dummy_alloc () =
  ignore (Sys.opaque_identity (ref 0));;
let my_fun x =
  my_dummy_alloc ();
  x;;

let my_handler _ = raise Exit;;
Sys.(set_signal sigint
       (Signal_handle my_handler));

for i = 1 to int_of_string Sys.argv.(1) do
  ignore (Sys.opaque_identity (my_fun i));
done;;

ocamlopt 发出如下所示的 AMD64 汇编代码

_camlTt__my_fun_166:
        subq    $8,%rsp
L104:
        subq    $16,%r15       # I want 8
        cmpq    8(%r14),%r15
        jb      L105
L107:
        leaq    8(%r15),%rbx
        movq    $1024,-8(%rbx)
        movq    $1,(%rbx)      # unneeded
        addq    $8,%rsp
        ret
L105:
        call    _caml_call_gc
L106:
        jmp     L107

根据我对堆分配块的内部表示的理解,包含一个头字和个数据字的块应该是可能的。

如何使用 OCaml 代码生成这样的块?


编辑。我有一种预感......

... Obj.new_block 可能会有所帮助。它没有。相反,运行时间翻了两番, 中断性消失了。

查看 asm 代码,我注意到 call _caml_c_call,它解释了我观察到的效果。回到第一个

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。