GHC呼叫安全或呼叫不安全

时间:2015-01-05 13:00:21

标签: haskell ghc ffi

亲爱的GHC / Haskell大师,

我目前正在使用GHC编写一个(中型)Haskell服务器应用程序,GHC通过FFI(大量)使用第三方C库函数。换句话说,在提供客户端请求时,服务器线程会进行多次FFI C调用。

目前,我正在不安全地调用所有C函数( unsafe ccall ),以便最大限度地减少调用开销。但这里的权衡是,不安全的ccalls不能被GHC RTS预先占用,这意味着所有其他Haskell线程都被阻塞,直到C函数返回。如果C函数耗时太长,这可能会有问题。

另一方面,安全ccalls 更昂贵,但它们将在不同的OS线程中运行,并且不会阻止GHC的工作线程。

我想,我在这里要问的是,您如何明智地做出最佳选择,无论是安全ccall 还是不安全ccall ?例如,如果C函数很短且很简单,我不想制作昂贵的安全ccall,但如果C函数需要很长时间才能返回(cpu-heavy计算,IO操作等),那么进行不安全的调用就是有问题,因为它会阻止工作线程。 是否存在一种近似阈值t,因此如果C函数需要的时间超过t才能完成,那么请将其设置为安全的ccall,否则会导致不安全的ccall?

我希望,这个问题有点道理,如果有不清楚的地方,请不要犹豫。

提前为你提供帮助!

1 个答案:

答案 0 :(得分:3)

经验法则如下:

  1. 制作所有内容safe
  2. 如果性能分析揭示了FFI调用开销中的性能问题,请仔细考虑unsafe的语义是否适合热点调用。
  3. 如果分析显示safe FFI调用的开销存在性能问题,并且调用的语义分析表明unsafe不会破坏任何内容,那么请考虑更改为{ {1}}如果预计呼叫的最坏情况时间优于1毫秒。
  4. 不要跳过前两个步骤。 unsafe比阻止RTS更具潜在问题。