I am running a simple OCaml program which opens a CSV file with a pseudo dict-reader and hashes "key" + "value" (where key and values are strings). Then some counts are evaluated on the hashes (but it is not really relevant for what follows).
After a quick look at the default OCaml profiler (
gprof), I noticed that my program was mostly spending time in hashing elements (I don't know what
caml_page_table_lookup does though).
Each sample counts as 0.01 seconds. % cumulative self self total time seconds seconds calls s/call s/call name 8.27 4.12 4.12 97999951 0.00 0.00 caml_hash 7.53 7.88 3.76 97999951 0.00 0.00 caml_hash_mix_string 5.12 10.43 2.55 136894800 0.00 0.00 caml_page_table_lookup
The hashtables are seldomly called in my code :
let get_indices dict n = Hashtbl.fold (fun k v acc -> ((Hashtbl.hash (k^v)) mod n) :: acc) dict  ;;
And here :
let dict_reader file_path = let line_stream = read_lines file_path in let header = split_line (Stream.next line_stream) in Stream.from (fun _ -> try Some (to_dict header (split_line (Stream.next line_stream))) with End_of_file -> None)
Is there a smart way to optimize these bottlenecks ? I feel like there is something redundant in evaluating hashes and storing values in hashtables...