如何解决保持紧密的无分配循环可中断
我想保持一个可中断的无分配循环。
我的问题是关于最小化分配成本。
这是我正在做的最小版本:
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
根据我对堆分配块的内部表示的理解,包含一个头字和零个数据字的块应该是可能的。
编辑。我有一种预感......
... Obj.new_block
可能会有所帮助。它没有。相反,运行时间翻了两番,
中断性消失了。
查看 asm 代码,我注意到 call _caml_c_call
,它解释了我观察到的效果。回到第一个!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。