Native OCaml compiler

Is there a reason for OCaml to be using the bytecode compiler (ocamlc). There is a native compiler provided with the distribution that is a lot faster. It is used by calling ocamlopt instead of ocamlc.

4 Likes

Damn right. That in itself sets OCaml apart from most other high-level languages. Could CodinGame consider invoking ocamlopt rather than ocamlc?

Yes please use the native compiler ocamlopt. During contest we have time limit to answer and the native code is something like 10 times faster than bytecode.

Also, please consider linking using the unix library in order to allow acces to timers, gettimeofday, …

As there don’t seem to be any answer to this thread from codingame, I will give the horrible hack that I used recently:

let () =
    if Sys.executable_name <> "/tmp/native" then begin
      ignore (Sys.command "ocamlopt /tmp/Answer.ml -o /tmp/native");
      ignore (Sys.command "/tmp/native")
    end

Note that this can also solve the problem of linking to str or num.

2 Likes

No since the original code won’t compile in bytecode.

For now, I think about use this kind of hack via bash but this might artificially change rankings

Participation in contests needs to use ocamlopt compiler in order to fully use the traditioal 100 ms of processing limit.

So please, use native compiler.

Hi.
I attach here a code which allows one to translate ocaml code in order to use native compilation.
The code itself and the generated code are uggly but it works Fill free to modify it and to reuse it.


(* translor <src.ml> produce a file <src_cg.ml> which prints the original code into a file before native compile it and then run the obtained code*)

let read_file_and_write fmt cin =
  try
    while true do
      let s = input_line cin in
      Format.fprintf fmt "%s@." (String.escaped s)
    done
  with _ -> ()


let main () =
  let file = Sys.argv.(1) in
  let cin = open_in file in
  let cout = open_out ((Filename.chop_extension (Filename.basename file))^"_cg.ml") in
  let fmt = Format.formatter_of_out_channel cout in 
  Format.fprintf fmt "let s = \"";
  f fmt cin;
  Format.fprintf fmt "\"@.";
  Format.fprintf fmt "let cout = open_out \"test.ml\"
                 let _ = output_string cout s
                 let _ = close_out cout
                 let _ = Sys.command \"ocamlopt -unsafe test.ml\" 
                 let _ = Sys.command \"./a.out\"
                 ";              
  close_in cin;
  close_out cout;
  ()
  
           
let _ = main ()

2 Likes

In your solution with a 100 ms limit, you loose the time of compilation. This trick is interesting but not in contest use case when time available is important to win.
I appreciate the fact of sharing this trick.

During last contests, 1 second was allowed to reply in first turn. Compilation is a matter of ms (maybe 10ms) and is only done during fist turn. I agree the trick is not so good but it allows one to use Ocaml in contest when not using the trick would prevent us to use it.

In fact, I’ve often had more problems with garbage collector, which can take up to 20ms even with native code and can be called at any time (not only during first turn), than with compilation (taking more ore less 1% of first turn time).

Your conclusion : ocaml can be used for competing thanks to a trick.

Replacing in CG parameters or code ocamlc to ocamlopt is a safer approach both for CG platform and for users.

Workarouds are temporary solutions that are remaining forever …

Yes,

i’d like not to have to use that quite ugly trick but since, hopefully for now, CG gives us only bytecode compilation .;;;

1 Like

Good news : ocaml compiler is now ocamlopt (i.e.: the native compiler).

Thank to CG

3 Likes

Yesss !!! Thank you !

Bad news we still can not link with useful libraries like unix in order to handle timeout…