この記事はPerl Advent Calendar 2024の7日目になります。
概要
JSON::PPのdecode_jsonメソッドの説明ではこれらは一緒だけど、速さが違うとありましたので、どの程度違うのか調べることにします。
ただし、検証に使用するJSON文字列には日本語は含まず半角英数のみとします〔特定条件での調査〕。
$perl_scalar = decode_json $json_text
$perl_scalar = JSON::PP->new->utf8->decode($json_text)
比較するメソッド
- decode_json
- JSON::PP->new->utf8->decode
- 以上2つは与えられた文字列がutf8文字列としてデコード
- JSON::PP->new->utf8(0)->decode
- 内部コードとしてデコード
方法とコード
1レコード当たり〔36項目 700バイト〕を5000レコードの文字列としそれを50回デコードすることとし、その速度を比較します。
#!perl
use v5.40;
use JSON::PP;
use utf8;
use Time::HiRes qw/gettimeofday tv_interval/;
my $jsonstr = 'JSON文字列'
my $c = "[" . $jsonstr;
for (my $i=1; $i<5000; $i++){
$c .= "," . $jsonstr;
}
$c .= "]";
for(my $i=0; $i<50; $i++){
&pGo;
}
sub pGo{
my $starttime = [gettimeofday];
my $x1 = decode_json($c);
my $raptime1 = tv_interval($starttime);
my $x2 = JSON::PP->new->utf8->decode($c);
my $raptime2 = tv_interval($starttime);
my $x3 = JSON::PP->new->utf8(0)->decode($c);
my $raptime3 = tv_interval($starttime);;
printf("A:%0.6f\n",$raptime1);
printf("B:%0.6f\n",$raptime2-$raptime1);
printf("C:%0.6f\n",$raptime3-$raptime2);
}
1;
結果
メソッド | 50回処理時間(秒) |
---|---|
decode_json | 50.96774 |
JSON::PP->new->utf8->decode | 50.99066 |
JSON::PP->new->utf8(0)->decode | 50.97722 |
私の端末では、3.5MByte程度の文字列のデコードにいずれも50回で50秒程でした。
まとめ
1件あたりの速度の違いはについては微々たるものであるとわかりました。
(12月13日追加)追加の実証実験が必要かもしれません。正しい結果が出ているか不安が大きいです。
use utf8;を使用していて、JSON文字列に日本語が含まれるときは、上記2つにおいてはEncodeモジュールでencode_utf8()を行う必要があるため、速度的には、3番目のJSON::PP->new->utf8(0)->decodeが一番早いのかもしれません。
思い立って実施したので、不備不足等、コメント欄で指摘いただけるとありがたいです。
以上です。ありがとうございました。