【问题标题】:Perl XS and Inline::CPerl XS 和内联::C
【发布时间】:2011-07-29 20:41:19
【问题描述】:

使用 XS 和 Inline::C 模块有什么区别?有人在this 问题中提到了这一点,这让我很好奇。

【问题讨论】:

    标签: perl perl-module xs


    【解决方案1】:

    Inline::C 生成 XS 并构建生成的模块。它在运行时执行此操作,尽管它会缓存过去的构建。

    Inline::C 可能更易于使用,但也有一些缺点。第一次运行时,它会减慢启动速度,需要在运行时创建文件的权限,并且需要编译模块的工具。此外,它使系统管理员更难安装。

    好处是,一旦事情开始成形,您就可以抓住生成的 XS 并消除 Inline::C。这使得它对原型设计很有用。

    【讨论】:

    • “XS”的难点在于理解 perl API。无论您使用 XS 还是 Inline::C,您都必须这样做。
    • 参见。实验性的 InlineX::XS 用于使用 Inline::C 进行原型设计和 XS 进行部署。
    【解决方案2】:

    Inline 在编译 Perl 的同时编译 C 代码,并且每次更改源代码时都会重新编译。 XS 编译一次,二进制文件像库一样保存为 .so 文件。

    Perl 是用 C 编写的,因此 XS 使用本地 Perl 类型和子例程机制。使用 XS 的模块的运行效率几乎与内置语言功能一样有效。在 Inline 中做一些事情比较困难,并且从你的代码调用或返回时会有一个转换步骤。话虽如此,内联在不需要时不重新编译方面做得很好,并且内联代码的转换不太可能对性能造成明显影响。

    最后,编写 XS 假设您正在打包一个模块。需要大量的 Perl 胆量和模块打包的设置和知识。如果只需要从 Perl 调用 C 库,最好使用 Inline。

    【讨论】:

    • Re“每次更改源代码时都会重新编译”,这是一件好事。直接使用XS的时候源代码发生变化还是需要重新编译,但不是自动的。
    • Re "调用或从你的代码返回时会有一个转换步骤。" XS 和 Inline::C 必然存在相同的转换步骤。事实上,Inline::C 让 XS 完成了所有的转换。
    猜你喜欢
    • 1970-01-01
    • 2018-03-24
    • 1970-01-01
    • 1970-01-01
    • 2013-05-31
    • 2016-12-21
    • 2011-04-04
    • 2010-12-25
    • 1970-01-01
    相关资源
    最近更新 更多