我正在为合并排序和快速排序做一个基准测试。
我实施了Random_list.create
,Mergesort.sort_list
和Quicksort.sort_list
. 我们可以假设这三个功能都已正确实现,并且在这个问题中实现并不重要。
我想问的是关于 OCaml 的 GC。
这是我的基准代码:
let _ =
let l = Random_list.create 10000000 in
let len1 = List.length (Mergesort.sort_list l) in
Printf.printf "mergesort done for %d elements" len1;
let len2 = List.length (Quicksort.sort_list l) in
Printf.printf "quicksort done for %d elements" len2
如果我运行上面的代码,它会Fatal error: exception Out_of_memory
在mergesort done for 10000000 elements
.
内存不足,没问题。输出也告诉我Out_of_memory
成功后发生mergesort
。
然后我所做的就是拆分代码并分别测试:
let _ =
let l = Random_list.create 10000000 in
let len1 = List.length (Mergesort.sort_list l) in
Printf.printf "mergesort done for %d elements" len1
接着
let _ =
let l = Random_list.create 10000000 in
let len2 = List.length (Quicksort.sort_list l) in
Printf.printf "quicksort done for %d elements" len2
没有. _ Out_of_memory
这是我的问题:
从我的基准代码中,是的,我进行了串行排序:合并排序,然后是快速排序。
在执行期间,应该创建 3 个主要列表:l
来自 mergesort 的列表和来自 quicksort 的列表。
但是,从合并排序创建的列表应该GCed
在快速排序之前,对吧?并且该列表没有任何参考,对吗?
在快速排序之前,只有一个原始的主要列表l
,对吗?
为什么它仍然给出Out_of_memory
错误?