C#で使いやすいJSON形式のシリアライザを探していたので、いくつか試してみるついでに速度検証をしてみました。
比較するシリアライザ
今回試すシリアライザは以下の4つです。
・DataContractJsonSerializer(.NET Framework標準)
→ http://msdn.microsoft.com/ja-jp/library/system.runtime.serialization.json.datacontractjsonserializer%28v=vs.110%29.aspx
・Json.NET(↑以外では割と一般的でNuGetでも2番目に出てくる)
→ http://james.newtonking.com/json
・ServiceStack.Text.JsonSerializer(SeriveStackライブラリ付属のシリアライザ)
→ https://github.com/ServiceStackV3/mythz_blog/blob/master/pages/344.md
(JavaScriptSerializerなんてものは最初からなかったんだ…。)
計測方法
計測は2パターン行います。
一つはシリアライズ/デシリアライズするオブジェクトに型が明確な場合、もう一つは型が不明確、というか匿名型です。
まずはシリアライズを100回(初回はオーバーヘッドがかかったため実際は99回)行い、その合計、平均、最大、最小時間を計測します。
次にシリアライズしたJSONを元の型にデシリアライズする処理を100回繰り返し、その合計、平均、最大、最小時間を計測します。
ただし、匿名型の方はデシリアライズしても意味がないのでシリアライズのみを計測します。
今回検証に使用する型は以下のクラスです。
public class Person
{
public int Id { get; set; }
public string Name { get; set; }
public BloodType BloodType { get; set; }
public DateTime BirthDate { get; set; }
public int[] FirendIds { get; set; }
}
public enum BloodType
{
A = 1,
B = 2,
AB = 3,
O = 4
}
計測結果
計測結果は以下の通りです。
(数値の単位は秒)
型が明確
・シリアライズ
・デシリアライズ
匿名型
・シリアライズ
DatraContractJsonSerializerが『-』となっているのは匿名型のシリアライズに対応していないためです。
シリアライズされたデータ
シリアライズだれたデータは以下のようになりました。
DataContractJsonSerializer
{"BirthDate":"\/Date(946652400000+0900)\/","BloodType":1,"FirendIds":[2,3,4],"Id":1,"Name":"Taro"}
Json.NET
{"Id":1,"Name":"Taro","BloodType":1,"BirthDate":"2000-01-01T00:00:00","FirendIds":[2,3,4]}
ServiceStack.Text.JsonSerializer
{"Id":1,"Name":"Taro","BloodType":"A","BirthDate":"\/Date(946652400000-0000)\/","FirendIds":[2,3,4]}
備考
使ってみた諸々の所感をまとめてみます。
DataContractJsonSerializer
・シリアライズの速度はそこそこなのにデシリアライズが遅く、使い勝手が悪い。
・匿名型をシリアライズができない。
Json.NET
・速度もそこそこ出てて、使い勝手は良い方。
・ある程度何でもできるので安定して使える。
(ASP.NET Web APIの標準実装にもなっている。)
ServiceStack.Text.JsonSerializer
・今回試してみた中では一番速い。
・ServiceStackの最新バージョンが有償とのことなので、ネックとなるのはこの辺か。