Skip to content

Commit

Permalink
ThreadIdLayoutRenderer - StringBuilder Append without garbage
Browse files Browse the repository at this point in the history
  • Loading branch information
snakefoot committed Oct 9, 2016
1 parent 4e63930 commit 44e867d
Show file tree
Hide file tree
Showing 2 changed files with 59 additions and 1 deletion.
58 changes: 58 additions & 0 deletions src/NLog/Internal/StringBuilderExt.cs
Original file line number Diff line number Diff line change
Expand Up @@ -59,5 +59,63 @@ public static void Append(this StringBuilder builder, object o, LogEventInfo log
builder.Append(Convert.ToString(o, formatProvider));
}

/// <summary>
/// Appends int without using culture, and most importantly without garbage
/// </summary>
/// <param name="builder"></param>
/// <param name="value">value to append</param>
public static void AppendInvariant(this StringBuilder builder, int value)
{
// Deal with negative numbers
if (value < 0)
{
builder.Append('-');
uint uint_value = uint.MaxValue - ((uint)value) + 1; //< This is to deal with Int32.MinValue
AppendInvariant(builder, uint_value);
}
else
{
AppendInvariant(builder, (uint)value);
}
}

/// <summary>
/// Appends uint without using culture, and most importantly without garbage
///
/// Credits Gavin Pugh - http://www.gavpugh.com/2010/04/01/xnac-avoiding-garbage-when-working-with-stringbuilder/
/// </summary>
/// <param name="builder"></param>
/// <param name="value">value to append</param>
public static void AppendInvariant(this StringBuilder builder, uint value)
{
// Calculate length of integer when written out
int length = 0;
uint length_calc = value;

do
{
length_calc /= 10;
length++;
}
while (length_calc > 0);

// Pad out space for writing.
builder.Append('0', length);

int strpos = builder.Length;

// We're writing backwards, one character at a time.
while (length > 0)
{
strpos--;

// Lookup from static char array, to cover hex values too
builder[strpos] = charToInt[value % 10];

value /= 10;
length--;
}
}
private static readonly char[] charToInt = new char[] { '0', '1', '2', '3', '4', '5', '6', '7', '8', '9' };
}
}
2 changes: 1 addition & 1 deletion src/NLog/LayoutRenderers/ThreadIdLayoutRenderer.cs
Original file line number Diff line number Diff line change
Expand Up @@ -51,7 +51,7 @@ public class ThreadIdLayoutRenderer : LayoutRenderer
protected override void Append(StringBuilder builder, LogEventInfo logEvent)
{
//no culture needed for ints
builder.Append(Thread.CurrentThread.ManagedThreadId.ToString(CultureInfo.InvariantCulture));
Internal.StringBuilderExt.AppendInvariant(builder, Thread.CurrentThread.ManagedThreadId);
}
}
}

0 comments on commit 44e867d

Please sign in to comment.