0

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 回目はまだ非常に長いです。

4

1 に答える 1

1

ここでよくある間違いを犯しています。コールド システム (最初のシリアライゼーション) とウォーム システム (2 番目のシリアライゼーション) を比較しています。

2 つの異なるインスタンスをシリアル化してみると、2 番目のシリアル化の方が高速であることがわかります。

つまり、キャッシュはありません。

また、ベンチマークの間違いに関する Eric Lippert のシリーズもぜひお読みください。

于 2013-08-06T08:28:45.133 に答える