マージソートとクイックソートのベンチマークを行っています。
Random_list.create
、Mergesort.sort_list
およびを実装しQuicksort.sort_list
ました。この質問では、3 つの関数が正しく実装されており、実装は重要ではないと想定できます。
聞きたいのは 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
afterが表示され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
マージソートからのリストとクイックソートからのリスト。
GCed
しかし、mergesort から作成されたリストは、quicksort の前にあるはずですよね? そのリストにはそれへの参照がありませんよね?
クイックソートの前に、元の主要なリストは 1 つだけl
ですよね?
それでもOut_of_memory
エラーが発生するのはなぜですか?