类编译的性能

时间:2014-09-03 08:25:39

标签: performance class compilation ocaml

考虑以下两个代码生成器:

(echo "class foo = object" ; for ((i = 0; i < 2000; i++)) do echo method x$i = $i; done ; echo end) > test.ml

(echo "" ; for ((i = 0; i < 2000; i++)) do echo let x$i = $i; done ; echo) > test.ml

前者使用可扩展的方法创建一个大类,而后者使用(顶层)模块执行相同的操作。

尽管如此,编译器的行为却大不相同:

% time ocamlc test.ml
ocamlc test.ml  19,89s user 0,01s system 99% cpu 19,950 total

% time ocamlc test.ml 
ocamlc test.ml  0,29s user 0,01s system 99% cpu 0,305 total

如果您使用循环限制,您会注意到模块可以在线性时间内编译,而类#&编译是二次的。我想知道是什么导致了这个问题,是否有办法避免它?

OCaml的类实现是否真的固有二进制编译过程?如果是这样,是否有一种语义等效的方式来分割工作并加快速度(即继承)?我必须生成大型类,因为我依赖于类方法的后期绑定。

0 个答案:

没有答案