GHC ccall 安全 VS ccall 不安全
GHC ccall safe VS ccall unsafe
亲爱的 GHC/Haskell 大师,
我目前正在使用 GHC 编写(中型)Haskell 服务器应用程序,它(大量)通过 FFI 使用第 3 方 C 库函数。换句话说,在为客户端请求提供服务时,服务器线程会进行多个 FFI C 调用。
目前我正在不安全地调用所有 C 函数 (unsafe ccall) 以最小化调用开销。但这里的权衡是,不安全的 ccalls 不能被 GHC RTS 抢占,这意味着所有其他 Haskell 线程都被阻塞,直到 C 函数 returns。如果 C 函数花费的时间太长,这可能会有问题。
另一方面,safe ccalls 更昂贵,但它们将在单独的 OS 线程中运行,并且不会阻塞 GHC 的工作线程。
我想,我想问的是,您如何明智地做出最佳选择,是进行 safe ccall 还是 unsafe ccall?例如,如果 C 函数短而琐碎,我不想进行昂贵的安全 ccall,但如果 C 函数需要很长时间才能 return (cpu-heavy 计算、IO 操作等),那么使不安全的调用是有问题的,因为它会阻塞工作线程。
是否有一种近似阈值 t
,以便如果 C 函数完成时间超过 t
,则将其设为安全 ccall,否则为不安全 ccall?
我希望这个问题有点道理,如果有什么不清楚的地方,请不要犹豫发表评论。
非常感谢您的提前帮助!
经验法则如下:
- 让一切都变得
safe
。
- 如果分析显示 FFI 调用的开销存在性能问题,请仔细考虑
unsafe
的语义是否适合热点调用。
- 如果分析显示
safe
FFI 调用的开销存在性能问题,并且调用的语义分析表明 unsafe
不会破坏任何内容,则考虑更改为 unsafe
如果预计调用的最坏情况时间优于 1 毫秒。
不要跳过前两步。 unsafe
有比阻止 RTS 更多的潜在问题。
亲爱的 GHC/Haskell 大师,
我目前正在使用 GHC 编写(中型)Haskell 服务器应用程序,它(大量)通过 FFI 使用第 3 方 C 库函数。换句话说,在为客户端请求提供服务时,服务器线程会进行多个 FFI C 调用。
目前我正在不安全地调用所有 C 函数 (unsafe ccall) 以最小化调用开销。但这里的权衡是,不安全的 ccalls 不能被 GHC RTS 抢占,这意味着所有其他 Haskell 线程都被阻塞,直到 C 函数 returns。如果 C 函数花费的时间太长,这可能会有问题。
另一方面,safe ccalls 更昂贵,但它们将在单独的 OS 线程中运行,并且不会阻塞 GHC 的工作线程。
我想,我想问的是,您如何明智地做出最佳选择,是进行 safe ccall 还是 unsafe ccall?例如,如果 C 函数短而琐碎,我不想进行昂贵的安全 ccall,但如果 C 函数需要很长时间才能 return (cpu-heavy 计算、IO 操作等),那么使不安全的调用是有问题的,因为它会阻塞工作线程。
是否有一种近似阈值 t
,以便如果 C 函数完成时间超过 t
,则将其设为安全 ccall,否则为不安全 ccall?
我希望这个问题有点道理,如果有什么不清楚的地方,请不要犹豫发表评论。
非常感谢您的提前帮助!
经验法则如下:
- 让一切都变得
safe
。 - 如果分析显示 FFI 调用的开销存在性能问题,请仔细考虑
unsafe
的语义是否适合热点调用。 - 如果分析显示
safe
FFI 调用的开销存在性能问题,并且调用的语义分析表明unsafe
不会破坏任何内容,则考虑更改为unsafe
如果预计调用的最坏情况时间优于 1 毫秒。
不要跳过前两步。 unsafe
有比阻止 RTS 更多的潜在问题。