現在、システムトレードの売買ルールを見つけるため、とりあえずブルートフォースで検証しまくるツール*1OCamlで動かしているのだけど、検証対象の売買ルールの数が2億8千万を越えているので、自宅の非力マシンではちょっと辛い。

で、いろいろ設計レベルのボトルネックを潰してぼちぼち性能が改善してきたので、今度はソースコードレベルで見直しているのだけど、ちょっと気になったのがOCamlの例外コスト。

適当に試してみた。

#load "unix.cma"

exception Hoge

let f_e i =
  if i >= 0 then raise Hoge

let test_e n =
  let rec loop i =
    if i > 0
    then (try f_e i with Hoge -> loop (i - 1)) in
  loop n

let f i =
  if i >= 0 then ()

let test n =
  let rec loop i =
    if i > 0
    then (f i; loop (i - 1)) in
  loop n

let _ =
  let n = 100_000_000 in
  let s = Unix.gettimeofday () in
  test n;
  let e = Unix.gettimeofday () in
  Printf.printf "normal :    %f\n" (e -. s);
  let s = Unix.gettimeofday () in
  test_e n;
  let e = Unix.gettimeofday () in
  Printf.printf "exception : %f\n" (e -. s)

で、

komamitsu@potato:~/lab/misc$ ocaml bench_ex.ml
normal :    20.562651
exception : 25.250192

と、何回か繰り替えしても同じくらいの差がつく。

まぁ、1億で5秒程度の差であれば毎回発生しても無視できるので気にしないでおくことに。


というか、まずprofとれという話ですな。

*1:あとで何かしらの多変量解析で攻めていこうとは考えているけれど、とりあえずそこそこの結果が出そうなブルートフォース