我在OCaml 论坛上寻求一些优化我的代码的建议。我使用了很多Array.setand Array.get(这是我的大部分代码1 2),有人告诉我我可以使用Array.unsafe_getandArray.unsafe_set来获得一些时间。
safe在这种情况下和function有什么区别unsafe?
不安全版本不执行边界检查。因此,如果您访问超出数组边界的索引,您可能会遇到分段错误或更糟糕的情况,其中安全版本只会抛出异常。
如果您已经显式或隐式检查了边界(例如,在循环条件中检查了它们),则仅应使用不安全函数1 ,例如2
(* here [i] is guaranteed to be in range by the loop condition,
so we can use the unsafe version to remove double check *)
let unsafe_init_array xs v =
for i = 0 to Array.length xs - 1 do
Array.unsafe_set xs i v
done
Run Code Online (Sandbox Code Playgroud)
1)顺便说一句,我个人从未看到使用这些函数有任何显着的性能提升(如果有的话)。我的猜测是,在现代超标量计算机中,推测执行能够并行加载数据并执行边界检查。所以,最终,他们不值得冒这个风险。不过,在不太复杂的架构上,情况可能会有所不同。和往常一样,YMMV,所以请对此持保留态度。
2)这个循环的安全版本在我的机器上只慢了 6%,但更安全、更容易阅读,
let safe_init_array xs v =
for i = 0 to Array.length xs - 1 do
xs.(i) <- v
done
Run Code Online (Sandbox Code Playgroud)