<Compile Include="$(BclSourcesRoot)\System\ThrowHelper.cs" />
<Compile Include="$(BclSourcesRoot)\System\String.CoreCLR.cs" />
<Compile Include="$(BclSourcesRoot)\System\Text\StringBuilder.CoreCLR.cs" />
- <Compile Include="$(BclSourcesRoot)\System\Text\StringBuilderCache.cs" />
<Compile Include="$(BclSourcesRoot)\System\Exception.cs" />
<Compile Include="$(BclSourcesRoot)\System\DateTime.CoreCLR.cs" />
<Compile Include="$(BclSourcesRoot)\System\OutOfMemoryException.cs" />
+++ /dev/null
-// Licensed to the .NET Foundation under one or more agreements.
-// The .NET Foundation licenses this file to you under the MIT license.
-// See the LICENSE file in the project root for more information.
-
-/*============================================================
-**
-**
-** Purpose: provide a cached reusable instance of stringbuilder
-** per thread it's an optimisation that reduces the
-** number of instances constructed and collected.
-**
-** Acquire - is used to get a string builder to use of a
-** particular size. It can be called any number of
-** times, if a stringbuilder is in the cache then
-** it will be returned and the cache emptied.
-** subsequent calls will return a new stringbuilder.
-**
-** A StringBuilder instance is cached in
-** Thread Local Storage and so there is one per thread
-**
-** Release - Place the specified builder in the cache if it is
-** not too big.
-** The stringbuilder should not be used after it has
-** been released.
-** Unbalanced Releases are perfectly acceptable. It
-** will merely cause the runtime to create a new
-** stringbuilder next time Acquire is called.
-**
-** GetStringAndRelease
-** - ToString() the stringbuilder, Release it to the
-** cache and return the resulting string
-**
-===========================================================*/
-
-using System.Threading;
-
-namespace System.Text
-{
- internal static class StringBuilderCache
- {
- // The value 360 was chosen in discussion with performance experts as a compromise between using
- // as litle memory (per thread) as possible and still covering a large part of short-lived
- // StringBuilder creations on the startup path of VS designers.
- private const int MAX_BUILDER_SIZE = 360;
-
- [ThreadStatic]
- private static StringBuilder CachedInstance;
-
- public static StringBuilder Acquire(int capacity = StringBuilder.DefaultCapacity)
- {
- if (capacity <= MAX_BUILDER_SIZE)
- {
- StringBuilder sb = StringBuilderCache.CachedInstance;
- if (sb != null)
- {
- // Avoid stringbuilder block fragmentation by getting a new StringBuilder
- // when the requested size is larger than the current capacity
- if (capacity <= sb.Capacity)
- {
- StringBuilderCache.CachedInstance = null;
- sb.Clear();
- return sb;
- }
- }
- }
- return new StringBuilder(capacity);
- }
-
- public static void Release(StringBuilder sb)
- {
- if (sb.Capacity <= MAX_BUILDER_SIZE)
- {
- StringBuilderCache.CachedInstance = sb;
- }
- }
-
- public static string GetStringAndRelease(StringBuilder sb)
- {
- string result = sb.ToString();
- Release(sb);
- return result;
- }
- }
-}
<Compile Include="$(MSBuildThisFileDirectory)System\StringSplitOptions.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\SystemException.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Text\ASCIIEncoding.cs" />
+ <Compile Include="$(MSBuildThisFileDirectory)System\Text\StringBuilderCache.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Text\Decoder.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Text\DecoderNLS.cs" />
<Compile Include="$(MSBuildThisFileDirectory)System\Text\DecoderBestFitFallback.cs" />
--- /dev/null
+// Licensed to the .NET Foundation under one or more agreements.
+// The .NET Foundation licenses this file to you under the MIT license.
+// See the LICENSE file in the project root for more information.
+
+namespace System.Text
+{
+ /// <summary>Provide a cached reusable instance of stringbuilder per thread.</summary>
+ internal static class StringBuilderCache
+ {
+ // The value 360 was chosen in discussion with performance experts as a compromise between using
+ // as litle memory per thread as possible and still covering a large part of short-lived
+ // StringBuilder creations on the startup path of VS designers.
+ private const int MaxBuilderSize = 360;
+ private const int DefaultCapacity = 16; // == StringBuilder.DefaultCapacity
+
+ // WARNING: We allow diagnostic tools to directly inspect this member (t_cachedInstance).
+ // See https://github.com/dotnet/corert/blob/master/Documentation/design-docs/diagnostics/diagnostics-tools-contract.md for more details.
+ // Please do not change the type, the name, or the semantic usage of this member without understanding the implication for tools.
+ // Get in touch with the diagnostics team if you have questions.
+ [ThreadStatic]
+ private static StringBuilder t_cachedInstance;
+
+ /// <summary>Get a StringBuilder for the specified capacity.</summary>
+ /// <remarks>If a StringBuilder of an appropriate size is cached, it will be returned and the cache emptied.</remarks>
+ public static StringBuilder Acquire(int capacity = DefaultCapacity)
+ {
+ if (capacity <= MaxBuilderSize)
+ {
+ StringBuilder sb = t_cachedInstance;
+ if (sb != null)
+ {
+ // Avoid stringbuilder block fragmentation by getting a new StringBuilder
+ // when the requested size is larger than the current capacity
+ if (capacity <= sb.Capacity)
+ {
+ t_cachedInstance = null;
+ sb.Clear();
+ return sb;
+ }
+ }
+ }
+ return new StringBuilder(capacity);
+ }
+
+ /// <summary>Place the specified builder in the cache if it is not too big.</summary>
+ public static void Release(StringBuilder sb)
+ {
+ if (sb.Capacity <= MaxBuilderSize)
+ {
+ t_cachedInstance = sb;
+ }
+ }
+
+ /// <summary>ToString() the stringbuilder, Release it to the cache, and return the resulting string.</summary>
+ public static string GetStringAndRelease(StringBuilder sb)
+ {
+ string result = sb.ToString();
+ Release(sb);
+ return result;
+ }
+ }
+}