简单序列化比JSON快? (在Ruby中)

时间:2010-03-19 08:06:55

标签: ruby json serialization jruby

我有一个用ruby编写的应用程序(在JRuby VM中运行)。在对其进行分析时,我意识到它花了很多时间(实际上几乎全部)将一些哈希值转换为JSON

这些哈希值包含符号键,其他类似哈希值,数组,字符串和数字。

是否有适合此类输入的序列化方法,并且通常比JSON运行得更快?如果它也具有Java或JRuby兼容的gem,那将更可取。

我目前正在使用jruby-json gem,这是JRuby中最快的JSON实现(据我所知),所以此举很可能是针对不同的序列化方法,而不仅仅是不同的图书馆。

任何帮助表示赞赏!感谢。

3 个答案:

答案 0 :(得分:6)

我刚刚在20分钟前听过这个项目(发布在黑客新闻上),它有一个Ruby实现:http://msgpack.sourceforge.net/#GettingStarted

  

MessagePack是一个基于二进制文件的高效对象序列化库。它可以在许多语言(如JSON)之间交换结构化对象。但与JSON不同,它非常快且小。

答案 1 :(得分:3)

我不知道JRuby的性能有多么不同,但在MRI中我认为Marshal通常是最快的。

One article I found发现Marshal比JSON快3倍(这本身比YAML快一些),而another one引用了2x的差异(参见JSON的第一条评论)。 / p>

当然,这些都不能保证适合您的特定情况。你能用Benchmark尝试每个选项吗?像这样:

require 'benchmark'
# other requires as necessary
N = 100 # or whatever multiple is needed to get a sensible result
Benchmark.bm(20) do |rpt|
  rpt.report("YAML") do
    N.times do
      # perform your task using YAML
    end
  end
  rpt.report("JSON") do
    # as above for JSON
  end
  rpt.report("Marshal") do
    # as above for JSON
  end
end

答案 2 :(得分:3)

编辑:我现在意识到这个答案可能不符合您的要求 - 我认为YAJL不适用于Java或JRuby。但是,我要离开这里了,因为YAJL本身就是摇滚乐,这可能有助于未来的一些Google员工。)

如果您喜欢JSON(并且已经有代码可以实现它),我强烈建议您查看YAJL。还有Ruby绑定:YAJL-Ruby

根据我的经验,它比Ruby的内置JSON引擎快得多。