我有一些与C应用程序交互的Ruby代码。现在,每次需要将数据传递给应用程序时,它都会使用Kernel#system方法生成可执行文件。与创建Ruby C扩展相比,这种方法在系统方面有哪些优点/缺点。
答案 0 :(得分:3)
优点
通过Kernel#system
调用本机代码是最简单的选项,因此代码最快。它也灵活 - 你不仅可以轻松调用C代码,还可以调用任何其他语言的可执行文件:shell脚本,Python,你有什么。
缺点
使用system
涉及相对大量开销:它会分叉您的Ruby解释器进程,执行子shell,调用C应用程序,然后等待子进程退出。所有这些在时间和系统资源方面都相当昂贵,特别是如果你在紧密的循环中这样做。
优点
通过编写C扩展来与本机代码连接,可以超快速度和低开销。在向C-land发送数据和从C-land发送数据方面,它还为您提供了更大的灵活性;使用system
,您需要能够通过命令行参数序列化子应用程序的输入(并且您需要使用反引号或管道来收集其输出),但是当您编写扩展时,您可以传入和传出Ruby对象,这使您可以构建更自然的API。
缺点
C扩展需要很多更多工作来正确编写,构建和分发。此外,如果你陷入C-land,你经常会崩溃你的解释器,而不是抛出异常,这是更难调试。除非你小心,否则你也可能会将自己绑定到你正在编写的平台上,会损害可移植性。
真的,最好的指导是从简单开始,并添加C扩展的复杂性,它实际上是有益的(阅读:基准测试后)。