使用Crystal创建Ruby gem本地扩展?

3

我只是想收集一些基本信息,因为我正在寻求提高ActiveModelSerializers性能的方法。

我之前从未编写过本地扩展,但已经查看了一些C扩展和Rust扩展。

我的问题:

  • 这是否已完成?(在Ruby gem中编写Crystal本地扩展)
  • 在Crystal中如何与Ruby对象/结构进行交互?(两种语言之间是否需要任何类型的封送或其他通信方式?)
2个回答

2

这是一个有趣的项目。有没有办法在Crystal中使用ActiveRecord对象来完成这个项目? - NullVoxPopuli
1
@NullVoxPopuli 尽管原生扩展是可能的/已经完成,但是没有办法有效地使用Crystal处理ActiveRecord对象。与这些复杂对象交互只有两种方法:1)将其转换为JSON并发送到Crystal。这比仅使用ActiveModelSerializers更糟糕。另一种方式2)是传递Ruby对象,然后从Crystal发送方法到该对象。这比仅在Ruby中调用方法效率低。如果您愿意,我很乐意在其他地方深入讨论这个问题(我是“crystalized_ruby”的作者)。 - Paul Hoffer
@PaulHoffer 你认为使用Crystal ORM并将对象发送到Ruby进行业务逻辑是否值得?也许在Crystal中具有DB和序列化功能?虽然,我猜那时我的项目大部分会已经在Crystal中了。哈 - NullVoxPopuli
@NullVoxPopuli 没错,那时你正在运行一个Crystal应用程序。逐步将性能受限的API转换为Crystal可能是有用的,例如。自去年十月以来已经取得了很多进展。Amber Framework是一个值得关注的框架。 - Paul Hoffer

1
这个问题可能已经被问了无数遍。你可以尝试去做,但请记住Crystal有一个垃圾回收器,因此编写Crystal的本地扩展并没有太多意义。使用C或Rust,它们没有垃圾回收器。

4
人们一直在使用 Haskell 和 OCaml 编写 MRI 和 YARV 扩展,它们都有垃圾回收功能。几乎所有 JRuby 的扩展都是用 Java 编写的,Java 也有垃圾回收功能。IronRuby 的扩展几乎全部是用 C# 写的,同样也有垃圾回收功能。Topaz 的扩展用 RPython 写,Opal 的用 ECMAScript 写,MagLev 的用 Smalltalk 写,等等。编写 Ruby 扩展不需要非要有垃圾回收。 - Jörg W Mittag
你有什么好的 Rust 示例吗?我看过这个项目:https://github.com/rustbridge/helix 但它似乎还有很长的路要走。 - NullVoxPopuli
我考虑过使用Crystal来作为Ruby扩展的潜在用例:计算密集型代码以及解析/生成二进制协议都会变得更加容易。 - Julien Portalier
@JulienPortalier 这就是我想做的。JSON API 在 ActiveModelSerializers 目前真的很慢,而我想要加速它。 - NullVoxPopuli
1
有更好的处理JSON的宝石,比如oj,而且json宝石已经用C写过了。我不认为你会在Crystal中获得更好的结果。 - Julien Portalier
我更关注JSON API结构是如何创建的,如果你有机会,请查看AMS存储库并运行bin/bench,你就会明白我在说什么了。有很多对象分配等操作。 - NullVoxPopuli

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接