DataContractSerializer を使用して大きなインスタンスをシリアル化すると、何倍ものコストがかかります。ただし、この連載が 2 回目になると、非常に高速になります。メモリには何らかの「キャッシュ」が存在するようです。以下のような私のテストコード:
//Create a big instance
object instance = ObjectInitializer.CreateObjectWithValue(type);
DataContractSerializer ser = new DataContractSerializer(type);
MemoryStream ms = new MemoryStream();
Stopwatch watcher = Stopwatch.StartNew();
ser.WriteObject(ms, instance);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
ser = new DataContractSerializer(type);
watcher = Stopwatch.StartNew();
ser.WriteObject(ms, instance);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
プログラム出力:
8605177
36970
その「キャッシュ」がどこにあるのか誰でも知っているので、このキャッシュを使用して最初のシリアル化時間を改善できます。
更新: @Daniel Hilgarth の回答を見た後、別のテストを行います。彼はウォーム システムについては正しいのですが、私のテスト結果から、実際には何らかの「キャッシュ」が存在するようです。
2 つの異なるタイプのインスタンスを選択します。最初のテスト:
watcher = Stopwatch.StartNew();
ser1.WriteObject(ms, instance1);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
watcher = Stopwatch.StartNew();
ser2.WriteObject(ms, instance2);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
2 番目のテストでは、2 つのインスタンスのシーケンスを切り替えます。
watcher = Stopwatch.StartNew();
ser2.WriteObject(ms, instance2);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
watcher = Stopwatch.StartNew();
ser1.WriteObject(ms, instance1);
watcher.Stop();
Console.WriteLine(watcher.ElapsedTicks);
結果: 1位:
8630129
10796746
2番目:
14346583
7543526
結果から、ウォーム システムはコールド システムよりも実際に高速に動作することがわかりました。ただし、同じ型の 2 つのインスタンスを 2 回シリアル化する場合と比べて、2 回目はまだ非常に長いです。