Perlテックブログ

ITエンジニアの成長意欲を刺激する技術考察、モジュール開発の日記。Perlイベントや国内や海外のPerlの記事の紹介。

Mojo::JSONとCpanel::JSON::XSの相互運用が始まった

最近のMojoliciousのアップデートの一番大きくうれしいのは、Mojo::JSONとCPanel::JSON::XSの相互運用が始まったことだ。

github.com

Cpanel::JSON::XSとは

Cpanel::JSON::XSのJSON::XSに対する変更点は、以下のように記述されている。

JSON :: XSの変更点

  • 文書化されているように、より厳密なdecode_json()。non-refsは許可されません。2番目のオプションの引数が追加されました。decode()はallow_nonrefになりました。
  • デュアルバール用の数字の固定エンコード。異なる文字列表現は保存されますが、同じ番号を表す一時的な文字列を持つ数字は、文字列ではなく数字として扱われます。Cpanel :: JSON :: XSは少し遅くなりますが、数値型をよりよく保存します。
  • .0滞在番号で終わる番号は整数に変換されません。内部的にはNOK型であるため、整数ではない数値(42+ "bar"!= 5.8.9)で表される[#63]デュアルヴァースは現在数値(=> 42.0)としてエンコードされます。しかし、!! 1は、5.8で「1」/1.0として間違ってエンコードされていても、依然として整数として表されます。
  • inf / nanの異なる取り扱い。デフォルトはnullになりました。オプションでstringify_infnan()を "inf" / "nan"に設定しました。[#28、#32]
  • binary非JSONJSON以外の拡張子を追加し、許可\xNNして\NNNシーケンスを追加しました。
  • 5.6.2サポート。いくつかのutf8の機能を犠牲にしています(全バイトを前提としています)、5.6のマルチバイトユニコード文字はありません。
  • true / falseオーバーロードのためのinteropJSON :: XS、JSON :: PP、Mojo ::ブール値のJSON表現が受け入れられ、JSON :: XSはCpanel :: JSON :: XSブール値を受け入れる[#13、#37]ブール値のオーバーロードを修正しました。Cpanel :: JSON :: XS :: trueは、他のすべてのJSONモジュールと同様に、「真」ではなく「1」に再び文字列を変換します。
  • YAML :: XSのように、yesとnoの真と偽へのネイティブブールマッピングperl !0ではyesです!1が、noです。JSON値trueは1にマップされ、falseは0にマップされます。[#39]
  • convert_blessedとallow_blessedを使用して、エンコードで任意の文字列をサポートします。
  • ithreadサポート。Cpanel :: JSON :: XSはスレッドセーフです.JSON :: XSはありません。
  • is_boolはメソッドとして呼び出すことができますが、JSON :: XS :: is_boolは呼び出されません。
  • スレッド化されたPerlのパフォーマンスの最適化
  • リラックスモード、多くの一般的な拡張機能を可能にする
  • 追加の修正:
  • [cpan #88061] AIX atof without USE_LONG_DOUBLE

  • #10 unshare_hek crash

  • #7, #29 avoid re-blessing where possible. It fails in JSON::XS for

READONLY values, i.e. restricted hashes.

  • #41 overloading of booleans, use the object not the reference.

  • #62 -Dusequadmath conversion and no SEGV.

  • #72 parsing of values followed \0, like 1\0 does fail.

  • #96 locale-insensitive numeric conversion
  • 公共の保守とバグ追跡
  • ppport.hを使用する、XS.xsコメントスタイルをサニファイする、Cコードスタイルを利用する
  • common :: senseはオプションです。利用可能な場合は、公開された制作モジュールでは開発とテストの間に使用されません。
  • JSON :: PP:stringify_infnan、allow_unknown、allow_stringify、allow_barekey、encode_stringify、allow_bignum、allow_singlequote、sort_by(部分的)、escape_slash、convert_blessed、...オプションのdecode_json(、allow_nonref)argからさらに多くのオプションとメソッドをサポートします。relaxedはallow_dupkeysを実装します。

この中で決定的に重要だと思えるのは、Perlのデータ構造とJSONのデータ構造に対する変換において、ピュアPerlで書かれたコードと、XSで書かれたコードに完全に互換性があるということでしょう。

Mojoliciousプロジェクトも、そのように判断したから、きっと相互運用を決定したのだろうと推測する。

Cpanel::JSON::XSがインストールされているとJSON出力が速くなる

Cpanel::JSON::XSは、インストールされている場合に、Mojo::JSONの代わりに自動的に利用されるようになりました。

一言でいうと、JSON出力めっちゃ速くなるということですね。