-Fixed potential null reference error when getting attributes -Performance documentation
84 lines
4.8 KiB
XML
84 lines
4.8 KiB
XML
<?xml version="1.0" encoding="utf-8"?>
|
|
<topic id="Performance" revisionNumber="1">
|
|
<developerConceptualDocument xmlns="http://ddue.schemas.microsoft.com/authoring/2003/5" xmlns:xlink="http://www.w3.org/1999/xlink">
|
|
<introduction>
|
|
<para>Out of the box Json.NET is faster than DataContractJsonSerializer and JavaScriptSerializer.
|
|
Here are some tips to make it go even faster.</para>
|
|
</introduction>
|
|
<section>
|
|
<title>Optimize Memory Usage</title>
|
|
<content>
|
|
<para>To keep an application consistantly fast it is important to minimize the
|
|
amount of time the .NET framework spends performing <externalLink>
|
|
<linkText>garbage collection</linkText>
|
|
<linkUri>http://msdn.microsoft.com/en-us/library/ms973837.aspx</linkUri>
|
|
<linkTarget>_blank</linkTarget>
|
|
</externalLink>.
|
|
Allocating too many objects, or allocating very large objects can slow down or even
|
|
halt an application while garbage collection is in progress.
|
|
</para>
|
|
<para>To minimize memory usage and the number of objects allocated Json.NET supports
|
|
serializing and deserializing directly to a stream. Reading or writing JSON a piece at a time instead of having
|
|
the entire JSON string loaded into memory is especially important when working with JSON
|
|
documents greater than 85kb in size to avoid the JSON string ending up in the <externalLink>
|
|
<linkText>large object heap</linkText>
|
|
<linkUri>http://msdn.microsoft.com/en-us/magazine/cc534993.aspx</linkUri>
|
|
<linkTarget>_blank</linkTarget>
|
|
</externalLink>.</para>
|
|
|
|
<code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\PerformanceTests.cs" region="DeserializeString" title="Deserialize String" />
|
|
<code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\PerformanceTests.cs" region="DeserializeStream" title="Deserialize Stream" />
|
|
|
|
</content>
|
|
</section>
|
|
<section>
|
|
<title>JsonConverters</title>
|
|
<content>
|
|
<para>Passing a <codeEntityReference>T:Newtonsoft.Json.JsonConverter</codeEntityReference> to SerializeObject or DeserializeObject provides a simple way to completely
|
|
change how an object is serialized. There is however a small overhead; the CanConvert method is called for every
|
|
type to check whether serialization should be handled by that JsonConverter.</para>
|
|
<para>There are a couple of ways to continue to use JsonConverters without any overhead. The simplest way
|
|
is to specify the JsonConverter using the <codeEntityReference>T:Newtonsoft.Json.JsonConverterAttribute</codeEntityReference>. This attribute tells the serializer
|
|
to always use that converter when serializing and deserializing the type, without the check.</para>
|
|
|
|
<code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\PerformanceTests.cs" region="JsonConverterAttribute" title="Use JsonConverter with JsonConverterAttribute" />
|
|
|
|
<para>If the class you want to convert isn't your own and you're unable to use an attribute a JsonConverter can still be used by
|
|
creating your own <codeEntityReference>T:Newtonsoft.Json.Serialization.IContractResolver</codeEntityReference>.</para>
|
|
|
|
<code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\PerformanceTests.cs" region="JsonConverterContractResolver" title="Use JsonConverter with IContractResolver" />
|
|
|
|
<para>The IContractResolver in the example above will set all DateTimes to use the JavaScriptDateConverter.</para>
|
|
</content>
|
|
</section>
|
|
<section>
|
|
<title>Manually Serialize</title>
|
|
<content>
|
|
<para>The absolute fastest way to read and write JSON is to use JsonTextReader and JsonTextWriter directly. Using a reader or writer
|
|
directly skips any of the overhead from a serializer such as reflection.</para>
|
|
|
|
<code lang="cs" source="..\Src\Newtonsoft.Json.Tests\Documentation\PerformanceTests.cs" region="ReaderWriter" title="Manually serialize using JsonTextWriter" />
|
|
|
|
<para>If performance is important and you don't mind more code to get it then this is your best choice.</para>
|
|
</content>
|
|
</section>
|
|
<section>
|
|
<title>Benchmarks</title>
|
|
<content>
|
|
|
|
<mediaLink>
|
|
<image class="image" xlink:href="performance" mimeType="image/png" width="643" height="345" />
|
|
<summary>Json.NET Performance</summary>
|
|
</mediaLink>
|
|
|
|
</content>
|
|
</section>
|
|
<relatedTopics>
|
|
<codeEntityReference>T:Newtonsoft.Json.JsonSerializer</codeEntityReference>
|
|
<codeEntityReference>T:Newtonsoft.Json.JsonConverter</codeEntityReference>
|
|
<codeEntityReference>T:Newtonsoft.Json.JsonConverterAttribute</codeEntityReference>
|
|
<codeEntityReference>T:Newtonsoft.Json.JsonTextWriter</codeEntityReference>
|
|
<codeEntityReference>T:Newtonsoft.Json.JsonTextReader</codeEntityReference>
|
|
</relatedTopics>
|
|
</developerConceptualDocument>
|
|
</topic> |