Perl6とJSON

[Perl 6 Advent Calendar 2015](http://qiita.com/advent-calendar/2015/perl6)の12日目です(遅刻)



## JSON

Perl6 で JSON を扱うには `to-json()` や `from-json()` を使います。

```pl
use v6;

my $file = '/usr/local/lib/node_modules/npm/package.json';
my $json = $file.IO.slurp;

# JSONから
my $a = from-json( $json );
$a.perl.say;

# JSONへ
my $b = to-json( $a );
$b.say;
```


## Benchmark

ただ、built-in の `JSON::Fast` は遅いという噂があるので、今でもそうなのかベンチマークを取ってみよう。

```
# JSON::Faster のインストール
$ panda install git://github.com/tony-o/perl6-json-faster.git

# JSON::Tiny のインストール
$ panda install JSON::Tiny
```

サンプルのjsonファイルは `JSON::Faster` 付録のベンチマークのものを使います。
[perl6-json-faster/benchmark/](https://github.com/tony-o/perl6-json-faster/tree/master/benchmark)

```pl
use v6;
use Bench;

my $json = 'projects.json'.IO.slurp;
my $nosj = from-json( $json );

my $繰り返し回数 = 3 #`(回) ;
my $bench = Bench.new;

$bench.cmpthese(
  $繰り返し回数,
  {
    'JSON::Fast.to-json'   => sub {                   to-json( $nosj ); },
    'JSON::Faster.to-json' => sub { use JSON::Faster; to-json( $nosj ); },
    'JSON::Tiny.to-json'   => sub { use JSON::Tiny;   to-json( $nosj ); },
  });

$bench.cmpthese(
  $繰り返し回数,
  {
    'JSON::Fast.from-json'   => sub {                   from-json( $json ); },
    'JSON::Faster.from-json' => sub { use JSON::Faster; from-json( $json ); },
    'JSON::Tiny.from-json'   => sub { use JSON::Tiny;   from-json( $json ); },
  });
```

```bash:出力
Benchmark:
Timing 3 iterations of JSON::Fast.to-json, JSON::Faster.to-json, JSON::Tiny.to-json...
JSON::Fast.to-json: 322.3456 wallclock secs @ 0.0093/s (n=3)
		(warning: too few iterations for a reliable count)
JSON::Faster.to-json: 7.2296 wallclock secs @ 0.4150/s (n=3)
		(warning: too few iterations for a reliable count)
JSON::Tiny.to-json: 259.3022 wallclock secs @ 0.0116/s (n=3)
		(warning: too few iterations for a reliable count)
O----------------------O--------O----------------------O--------------------O--------------------O
|                      | s/iter | JSON::Faster.to-json | JSON::Tiny.to-json | JSON::Fast.to-json |
O======================O========O======================O====================O====================O
| JSON::Faster.to-json | 2.41   | --                   | 3487%              | 4359%              |
| JSON::Tiny.to-json   | 86.4   | -97%                 | --                 | 24%                |
| JSON::Fast.to-json   | 107    | -98%                 | -20%               | --                 |
--------------------------------------------------------------------------------------------------
Benchmark:
Timing 3 iterations of JSON::Fast.from-json, JSON::Faster.from-json, JSON::Tiny.from-json...
JSON::Fast.from-json: 11.2349 wallclock secs @ 0.2670/s (n=3)
		(warning: too few iterations for a reliable count)
JSON::Faster.from-json: 12.5122 wallclock secs @ 0.2398/s (n=3)
		(warning: too few iterations for a reliable count)
JSON::Tiny.from-json: 10.4782 wallclock secs @ 0.2863/s (n=3)
		(warning: too few iterations for a reliable count)
O------------------------O--------O----------------------O------------------------O----------------------O
|                        | s/iter | JSON::Fast.from-json | JSON::Faster.from-json | JSON::Tiny.from-json |
O========================O========O======================O========================O======================O
| JSON::Fast.from-json   | 3.74   | --                   | 11%                    | -7%                  |
| JSON::Faster.from-json | 4.17   | -10%                 | --                     | -16%                 |
| JSON::Tiny.from-json   | 3.49   | 7%                   | 19%                    | --                   |
----------------------------------------------------------------------------------------------------------
```

`to-json`は`JSON::Faster`がダントツで超速く、`from-json`は`JSON::Tiny`が若干速い感じでしょうか。

おわりです。


## 参考と注釈

* [tony-o/perl6-json-faster](https://github.com/tony-o/perl6-json-faster)
* [timo/json_fast](https://github.com/timo/json_fast)
* [Perl6 の Panda でインストールがちゃんと出来なくなった場合の修正方法。Add Star](http://mattn.kaoriya.net/software/lang/perl6/20150917214326.htm)
* [Input/Output - Perl 6 Documentation](http://doc.perl6.org/language/io#Reading_from_files)
* [ベンチマークをとる - Qiita](http://qiita.com/B73W56H84/items/3c1b18ef60b4d1f381d5)