RJSONIO和rjson比较 - 更好的优化

17

更新:

RJSONIO不再是两个选项中速度更快的一个,相反,rjson现在要快得多。

有关结果的其他确认,请参见评论部分。


我原本认为RJSONIO应该比rjson更快。
然而,我的测试结果却相反。

我的问题是:

  • 是否有任何调整可以/应该执行,以改善从RJSONIO获得的结果? (即,我是否忽略了什么?)

以下是使用真实数据(其中U是 json 页面的内容)和虚构的 json 进行比较的结果。

## REAL DATA
library(microbenchmark)
> microbenchmark(RJSONIO::fromJSON(U), rjson::fromJSON(U))

Unit: milliseconds
                  expr       min        lq    median        uq      max
1   rjson::fromJSON(U)  29.46913  30.16218  31.74999  34.11012 158.6932
2 RJSONIO::fromJSON(U) 175.11514 181.67742 186.52871 195.90646 414.6160

> microbenchmark(RJSONIO::fromJSON(U, simplify=FALSE), rjson::fromJSON(U))
Unit: milliseconds
                                    expr       min       lq    median        uq        max
1                     rjson::fromJSON(U)  27.92341  28.7430  29.60091  30.63291 1 143.9478
2 RJSONIO::fromJSON(U, simplify = FALSE) 173.30136 179.5815 183.94315 190.17245 2 328.8996

使用模拟数据的示例

(类似的结果)


# MOCK DATA
U <- toJSON(list(1:10, LETTERS, letters, rnorm(20)))

microbenchmark(RJSONIO::fromJSON(U), rjson::fromJSON(U))
# Unit: microseconds
#                   expr     min       lq   median       uq      max
# 1   rjson::fromJSON(U)  94.788 100.8650 105.6035 111.0740 3457.479
# 2 RJSONIO::fromJSON(U) 520.131 527.7775 533.2715 555.2415  942.136

使用iris 数据集的示例2

Iris.JSON <- toJSON(iris)

microbenchmark(RJSONIO::fromJSON(Iris.JSON), rjson::fromJSON(Iris.JSON))
# Unit: microseconds
#                           expr      min       lq   median       uq       max
# 1   rjson::fromJSON(Iris.JSON)  229.669  235.571  238.511  241.423   260.164
# 2 RJSONIO::fromJSON(Iris.JSON) 1209.607 1224.793 1232.165 1238.953 12039.772

> sessionInfo()
R version 2.15.1 (2012-06-22)
Platform: x86_64-apple-darwin9.8.0/x86_64 (64-bit)

locale:
[1] en_US.UTF-8/en_US.UTF-8/en_US.UTF-8/C/en_US.UTF-8/en_US.UTF-8

attached base packages:
[1] stats     graphics  grDevices utils     datasets  methods   base

other attached packages:
[1] data.table_1.8.8 stringr_0.6.1    RJSONIO_1.0-1    rjson_0.2.11

loaded via a namespace (and not attached):
[1] plyr_1.7.1

1
我测试了你的基准测试,并确认了结果(我使用simplify = FALSE来获得相同的结果)- 你期望得到什么答案? - agstudy
我们能否提供一个完整可复现的例子?因为在我的设置中,RJSONIO比rjson快得多。 - dickoa
@agstudy,我本来期望翻转结果——也就是说RJSONIO应该会快得多。这基于我听到的关于RJSONIO的信息,因此我试图确认它是否确实较慢,或者我只是做错了什么。 - Ricardo Saporta
2
@RicardoSaporta: 对,我们对此有共识。我只是写了一篇关于历史的文章,因为我在一年前的二月份非常严肃地对这两个包进行了基准测试,而RJSONIO表现得要好得多。之后我就停止了关注任何关于rjson包的消息,这很遗憾,因为在2012年3月,它开始使用JSON解析器的C实现——在我看来,与已经使用了C库的RJSONIO相比,在那时变得更快了。 - daroczig
8
对于任何在2015年之后使用的人,我强烈推荐使用jsonlite - timelyportfolio
显示剩余5条评论
2个回答

1
> library('BBmisc')
> suppressAll(lib(c('RJSONIO','rjson','jsonlite','microbenchmark')))
> U <- toJSON(list(1:10, LETTERS, letters, rnorm(20)))
> microbenchmark(
+     rjson::toJSON(U),
+     RJSONIO::toJSON(U),
+     jsonlite::toJSON(U, dataframe = "column"),
+     times = 10
+ )
Unit: microseconds
                                      expr     min      lq      mean   median      uq       max neval cld
                          rjson::toJSON(U)  65.174  68.767 2002.7007  88.2675 103.151 19179.224    10   a
                        RJSONIO::toJSON(U) 299.186 304.832  482.8038 329.7210 493.683  1351.727    10   a
 jsonlite::toJSON(U, dataframe = "column") 485.985 501.381  555.4192 548.5935 587.083   708.708    10   a

测试 system.time()

> microbenchmark(
+     system.time(rjson::toJSON(U)),
+     system.time(RJSONIO::toJSON(U)),
+     system.time(jsonlite::toJSON(U, dataframe = "column")),
+     times = 10)
Unit: milliseconds
                                                   expr      min       lq     mean   median       uq      max neval cld
                          system.time(rjson::toJSON(U)) 112.0660 115.8677 119.8426 119.8372 121.6908 132.2111    10  ab
                        system.time(RJSONIO::toJSON(U)) 115.4223 118.0262 129.2758 120.5690 148.5175 151.6874    10   b
 system.time(jsonlite::toJSON(U, dataframe = "column")) 113.2674 114.9096 118.0905 117.8401 120.9626 123.6784    10  a

以下是几个包的比较。希望这些链接能够帮助到您...
1) 新包:jsonlite。一个更智能的JSON编码器/解码器。 2) jsonlite 0.9.15中改进了内存使用和与RJSONIO的兼容性。 3) R中JSON包的有偏差比较。

0

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