亲爱的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?
我希望,这个问题有点道理,如果有不清楚的地方,请不要犹豫。
提前为你提供帮助!
答案 0 :(得分:3)
经验法则如下:
safe
。unsafe
的语义是否适合热点调用。safe
FFI调用的开销存在性能问题,并且调用的语义分析表明unsafe
不会破坏任何内容,那么请考虑更改为{ {1}}如果预计呼叫的最坏情况时间优于1毫秒。不要跳过前两个步骤。 unsafe
比阻止RTS更具潜在问题。