As your OCaml programs grow bigger, it is a good idea to use a build system. Ocamlbuild is quite good at this job ! It will take care of your dependencies, find libraries and more importantly compile the files in the right order…
It took me a while to find the answer to the simple question, how to use ocamlopt
instead of the default compiler. Assuming you want to compile a main.ml file, the short answer is to use ocamlbuild main.native
, instead of ocamlbuild main.byte
ocamlopt and ocamlc
OCaml comes with two compilers : ocamlc and ocamlopt. ocamlc
is the bytecode compiler, and ocamlopt
is the native code compiler. If you don’t know which one to use, use ocamlopt
since it provides standalone executables that are normally faster than bytecode.
Example
For a very quick benchmark let’s sort a long list.
let a = List.init 1000000 (fun x -> Random.int 500) ;;
let b = List.sort compare a ;;
print_string "done;\n";
And compile this with the different compilers…
ocamlbuild main.native
echo "native"
time ./main.native
rm main.native
rm -rf _build/
ocamlbuild main.byte
echo "byte"
time ./main.byte
rm main.byte
rm -rf _build/
And the results are quite convincing.
Finished, 4 targets (0 cached) in 00:00:00.
native
done;
real 0m2.156s
user 0m2.064s
sys 0m0.088s
Finished, 3 targets (0 cached) in 00:00:00.
byte
done;
real 0m6.340s
user 0m6.268s
sys 0m0.068s
Learning more
Real World OCaml: Functional programming for the masses by Yaron Minsky, Anil Madhavapeddy and Jason Hickey is a good introduction to OCaml.