Browse Source

Greatly reduce allocations for float/double/decimal

voice-allocs
RogueException 7 years ago
parent
commit
ebf12e351d
3 changed files with 26 additions and 15 deletions
  1. +22
    -12
      src/Discord.Net.Serialization/Extensions/BufferExtensions.cs
  2. +3
    -2
      src/Discord.Net.Serialization/Extensions/JsonReaderExtensions.cs
  3. +1
    -1
      src/Discord.Net.Serialization/Json/Converters/Primitives.Other.cs

+ 22
- 12
src/Discord.Net.Serialization/Extensions/BufferExtensions.cs View File

@@ -9,13 +9,6 @@ namespace Discord.Serialization
{
private static readonly ParsedFormat _numberFormat = new ParsedFormat('D');

public static bool ParseBool(this ReadOnlySpan<byte> text)
{
if (PrimitiveParser.TryParseBoolean(text, out bool result, out int ignored, SymbolTable.InvariantUtf8))
return result;
throw new SerializationException("Failed to parse Boolean");
}

public static sbyte ParseInt8(this ReadOnlySpan<byte> text)
{
if (PrimitiveParser.TryParseSByte(text, out sbyte result, out int ignored, _numberFormat, SymbolTable.InvariantUtf8))
@@ -77,19 +70,22 @@ namespace Discord.Serialization

public static float ParseSingle(this ReadOnlySpan<byte> text)
{
if (PrimitiveParser.TryParseDecimal(text, out decimal result, out int ignored, SymbolTable.InvariantUtf8))
return (float)result;
//TODO: Allocs a string
if (float.TryParse(ParseString(text), out float result))
return result;
throw new SerializationException("Failed to parse Single");
}
public static double ParseDouble(this ReadOnlySpan<byte> text)
{
if (PrimitiveParser.TryParseDecimal(text, out decimal result, out int ignored, SymbolTable.InvariantUtf8))
return (double)result;
//TODO: Allocs a string
if (double.TryParse(ParseString(text), out double result))
return result;
throw new SerializationException("Failed to parse Double");
}
public static decimal ParseDecimal(this ReadOnlySpan<byte> text)
{
if (PrimitiveParser.TryParseDecimal(text, out decimal result, out int ignored, SymbolTable.InvariantUtf8))
//TODO: Allocs a string
if (decimal.TryParse(ParseString(text), out decimal result))
return result;
throw new SerializationException("Failed to parse Decimal");
}
@@ -271,5 +267,19 @@ namespace Discord.Serialization
value = (int)(parsedValue);
return true;
}

public static bool ParseBool(this ReadOnlySpan<byte> text)
{
if (PrimitiveParser.TryParseBoolean(text, out bool result, out int ignored, SymbolTable.InvariantUtf8))
return result;
throw new SerializationException("Failed to parse Boolean");
}
public static Guid ParseGuid(this ReadOnlySpan<byte> text)
{
//TODO: Allocs a string
if (Guid.TryParse(text.ParseString(), out var result))
return result;
throw new SerializationException("Failed to parse Guid");
}
}
}

+ 3
- 2
src/Discord.Net.Serialization/Extensions/JsonReaderExtensions.cs View File

@@ -5,8 +5,6 @@ namespace Discord.Serialization
{
public static class JsonReaderExtensions
{
public static bool ParseBool(this JsonReader reader) => reader.Value.ParseBool();

public static sbyte ParseInt8(this JsonReader reader) => reader.Value.ParseInt8();
public static short ParseInt16(this JsonReader reader) => reader.Value.ParseInt16();
public static int ParseInt32(this JsonReader reader) => reader.Value.ParseInt32();
@@ -27,6 +25,9 @@ namespace Discord.Serialization
public static DateTime ParseDateTime(this JsonReader reader) => reader.Value.ParseDateTime();
public static DateTimeOffset ParseDateTimeOffset(this JsonReader reader) => reader.Value.ParseDateTimeOffset();

public static bool ParseBool(this JsonReader reader) => reader.Value.ParseBool();
public static Guid ParseGuid(this JsonReader reader) => reader.Value.ParseGuid();

public static void Skip(this JsonReader reader)
{
int initialDepth = reader._depth;


+ 1
- 1
src/Discord.Net.Serialization/Json/Converters/Primitives.Other.cs View File

@@ -33,7 +33,7 @@ namespace Discord.Serialization.Json.Converters
reader.Read();
if (reader.ValueType != JsonValueType.String)
throw new SerializationException("Bad input, expected String");
return Guid.Parse(reader.ParseString()); //TODO: Causes allocs
return reader.ParseGuid();
}
public void Write(PropertyMap map, ref JsonWriter writer, Guid value, bool isTopLevel)
{


Loading…
Cancel
Save