gpt4 book ai didi

ruby - 将数据存储在 ruby​​ C 扩展中——这个主意好不好?

转载 作者:太空宇宙 更新时间:2023-11-03 16:34:57 26 4
gpt4 key购买 nike

我的团队正在使用 Ruby 开发 MMO 服务器,我们选择开始将计算密集型操作转移到 C 扩展中。作为这项工作的一部分,我们将实际的数据存储转移到 C 中(使用 Data_Get_Struct 等)。因此,例如,每个 Ruby“Zone”对象都有一个关联的“ZoneKernel::Zone”C 结构,其中存储了实际的二进制数据。

基本上,我想知道这是否是个糟糕的主意。我不太熟悉 ruby​​ 的内部结构,但似乎只要父区域保留在 ruby​​ 端的内存中(从而防止 C 数据的垃圾收集),数据就应该没问题。

需要注意的是,我们已经收到半规则的“堆栈一致性错误”,这会导致我们的服务器崩溃——这似乎是一个潜在的相关内存问题(而不仅仅是你常见的段错误)——如果有人知道什么可能是这样,我也很感激!

最佳答案

the documentation to Data_Wrap_Struct(klass, mark, free, ptr) function 中所述:

The free argument is the function to free the pointer allocation. If this is -1, the pointer will be just freed.

These mark / free functions are invoked during GC execution.

当相应的 Ruby 对象完成时,您包装的 native 结构将自动释放。在此之前,您的数据不会被释放,除非您手动释放。

编写 C 扩展并不能保证性能提升,但它几乎总是会增加代码的复杂性。分析您的服务器以衡量您的性能提升,并在可行的情况下使用纯 Ruby 开发您的 Zone 类。

关于ruby - 将数据存储在 ruby​​ C 扩展中——这个主意好不好?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9217147/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com