0

我有一些与 C 应用程序交互的 Ruby 代码。现在,每次需要将数据传递给应用程序时,它都会使用Kernel#system方法生成可执行文件。与创建 Ruby C 扩展相比,这种方法在系统方面有哪些优点/缺点。

4

1 回答 1

3

内核#system

好处

通过调用本机代码Kernel#system最简单的实现选项,因此也是最快的编码方式。它也很灵活——您不仅可以轻松调用 C 代码,还可以轻松调用任何其他语言的可执行文件:shell 脚本、Python 等等。

缺点

使用system涉及相对大量的开销:它派生您的 Ruby 解释器进程,执行子 shell,调用 C 应用程序,然后等待子进程退出。所有这些在时间和系统资源方面都是相当昂贵的,特别是如果你在一个紧密的循环中进行。

C 扩展

好处

通过编写 C 扩展来与本机代码交互可以让您获得极快的速度低开销。它还为您在向 C-land 发送数据和从 C-land 发送数据方面提供了更大的灵活性;使用system,您需要能够通过命令行参数序列化子应用程序的输入(并且您需要使用反引号或管道来收集其输出),但是当您编写扩展时,您可以只传递 Ruby 对象并out,它可以让您构建更自然的 API。

缺点

C 扩展需要更多的工作来正确编写、构建和分发。此外,如果你在 C 领域搞砸了,你会经常崩溃你的解释器而不是抛出一个异常,这更难调试。除非您很小心,否则您也可能会将自己绑定到您正在编写的平台上,这会损害可移植性

概括

确实,最好的指导是从简单开始,然后在实际显着有益的地方添加 C 扩展的复杂性(阅读:基准测试之后)。

于 2013-10-25T21:15:45.007 回答