【问题标题】:Ruby gem native extension with Crystal?使用 Crystal 的 Ruby gem 原生扩展?
【发布时间】:2016-09-12 18:00:12
【问题描述】:

我只是想收集一些一般信息,因为我希望提高 ActiveModelSerializer 的性能。

我之前也从未编写过原生扩展,但看过一些 C 扩展和 Rust 扩展。

我的问题:

  • 已经完成了吗? (在 ruby​​ gem 中编写水晶原生扩展?)
  • 与红宝石物体/结构的交互如何在水晶中起作用? (是否需要任何形式的编组或任何东西来在两种语言之间进行通信?)

【问题讨论】:

    标签: ruby rubygems crystal-lang ruby-native-extensions


    【解决方案1】:

    由于 Ruby API 是用 C 编写的,应该可以为其创建 Crystal 绑定,然后在 Crystal 中编写 Ruby 扩展。

    查看crystalyzed_ruby 项目,例如: https://github.com/phoffer/crystalized_ruby

    【讨论】:

    • 这绝对是一个有趣的项目。无论如何使用这个在 Crystal 中使用 ActiveRecord 对象?
    • @NullVoxPopuli 虽然本地扩展是可能的/已经完成,但没有办法使用 Crystal 有效地处理 ActiveRecord 对象。与这些复杂对象交互只有两种方法:1)转换为 JSON 并发送到 Crystal。这将比仅使用 ActiveModelSerializers 更糟糕。另一种方法 2) 是传递 Ruby 对象,然后将方法从 Crystal 发送到该对象。这比在 Ruby 中调用方法效率低。如果您愿意,我很乐意在其他地方更深入地讨论这个问题(我是 crystalized_ruby 的作者)
    • @PaulHoffer 您认为使用水晶 ORM 并将对象发送到 ruby​​ 进行业务逻辑是否值得?也许在水晶中有数据库和序列化的东西?不过,我想那时,我的大部分项目已经在水晶中了。哈
    • @NullVoxPopuli 确切地说,此时您正在运行 Crystal 应用程序。例如,逐渐将性能受限的 API 转换为 Crystal 可能很有用。自去年 10 月以来也取得了很大进展。 Amber 框架是值得一试的
    【解决方案2】:

    这个问题现在可能已经被问了一百万次了。您可以尝试这样做,但请记住 Crystal 具有 GC,因此在 Crystal 中编写本机扩展确实没有多大意义。使用没有 GC 的 C 或 Rust。

    【讨论】:

    • 人们一直在用 Haskell 和 OCaml 编写 MRI 和 YARV 扩展,这两者也有 GC。 JRuby 的扩展几乎完全用 Java 编写,Java 也有 GC。 IronRuby 的扩展几乎完全用 C♯ 编写,同样使用 GC。 Topaz 的扩展用 RPython 编写,Opal 用 ECMAScript 编写,MagLev 用 Smalltalk 编写,等等。编写 Ruby 扩展不需要 GC。
    • 你有什么好的防锈例子吗?我看过这个项目:github.com/rustbridge/helix,但看起来它还有很长的路要走。
    • 我考虑过使用 Crystal 进行 Ruby 扩展的潜在用例:计算成本高昂的代码,以及解析/生成二进制协议非常容易。
    • @JulienPortalier 这就是我想做的。 JSON API 在 ActiveModelSerializers atm 中真的很慢,我想加快速度。
    • 有更好的处理 JSON 的 gem,比如 oj,而且 json gem 已经用 C 编写了。我认为使用 Crystal 不会得到更好的结果。
    猜你喜欢
    • 2011-05-27
    • 2010-09-07
    • 1970-01-01
    • 1970-01-01
    • 2018-07-17
    • 1970-01-01
    • 2015-08-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多