Skip to content
This repository was archived by the owner on Dec 24, 2022. It is now read-only.

Commit b78f25d

Browse files
committed
Optimize search methods by signature
1 parent 524cdb7 commit b78f25d

File tree

6 files changed

+17
-7
lines changed

6 files changed

+17
-7
lines changed

src/ServiceStack.Text/Common/DeserializeArray.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,14 +36,15 @@ public static Func<string, ParseStringDelegate, object> GetParseFn(Type type)
3636
return (s, d) => func(new StringSegment(s), v => d(v.Value));
3737
}
3838

39+
private static readonly Type[] signature = {typeof(StringSegment), typeof(ParseStringSegmentDelegate)};
3940

4041
public static Func<StringSegment, ParseStringSegmentDelegate, object> GetParseStringSegmentFn(Type type)
4142
{
4243
ParseArrayOfElementsDelegate parseFn;
4344
if (ParseDelegateCache.TryGetValue(type, out parseFn)) return parseFn.Invoke;
4445

4546
var genericType = typeof(DeserializeArrayWithElements<,>).MakeGenericType(type, typeof(TSerializer));
46-
var mi = genericType.GetStaticMethod("ParseGenericArray", new [] {typeof(StringSegment), typeof(ParseStringSegmentDelegate)});
47+
var mi = genericType.GetStaticMethod("ParseGenericArray", signature);
4748
parseFn = (ParseArrayOfElementsDelegate)mi.CreateDelegate(typeof(ParseArrayOfElementsDelegate));
4849

4950
Dictionary<Type, ParseArrayOfElementsDelegate> snapshot, newCache;

src/ServiceStack.Text/Common/DeserializeBuiltin.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -124,7 +124,7 @@ private static ParseStringSegmentDelegate GetParseStringSegmentFn()
124124
case TypeCode.Double:
125125
return value => value.IsNullOrEmpty() ? (double?)null : double.Parse(value.Value, CultureInfo.InvariantCulture);
126126
case TypeCode.Decimal:
127-
return value => value.IsNullOrEmpty() ? (decimal?)null : decimal.Parse(value.Value, NumberStyles.Float | NumberStyles.AllowThousands, CultureInfo.InvariantCulture);
127+
return value => value.IsNullOrEmpty() ? (decimal?)null : value.ParseDecimal(allowThousands: true);
128128
case TypeCode.DateTime:
129129
return value => DateTimeSerializer.ParseShortestNullableXsdDateTime(value.Value);
130130
case TypeCode.Char:

src/ServiceStack.Text/Common/DeserializeDictionary.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -291,6 +291,7 @@ public static object ParseDictionaryType(string value, Type createMapType, Type[
291291
ParseDictionaryType(new StringSegment(value), createMapType, argTypes,
292292
v => keyParseFn(v.Value), v => valueParseFn(v.Value));
293293

294+
static readonly Type[] signature = {typeof(StringSegment), typeof(Type), typeof(ParseStringSegmentDelegate), typeof(ParseStringSegmentDelegate)};
294295

295296
public static object ParseDictionaryType(StringSegment value, Type createMapType, Type[] argTypes,
296297
ParseStringSegmentDelegate keyParseFn, ParseStringSegmentDelegate valueParseFn)
@@ -301,8 +302,7 @@ public static object ParseDictionaryType(StringSegment value, Type createMapType
301302
if (ParseDelegateCache.TryGetValue(key, out parseDelegate))
302303
return parseDelegate(value, createMapType, keyParseFn, valueParseFn);
303304

304-
var mi = typeof(DeserializeDictionary<TSerializer>).GetStaticMethod("ParseDictionary",
305-
new [] {typeof(StringSegment), typeof(Type), typeof(ParseStringSegmentDelegate), typeof(ParseStringSegmentDelegate)});
305+
var mi = typeof(DeserializeDictionary<TSerializer>).GetStaticMethod("ParseDictionary", signature);
306306
var genericMi = mi.MakeGenericMethod(argTypes);
307307
parseDelegate = (ParseDictionaryDelegate)genericMi.MakeDelegate(typeof(ParseDictionaryDelegate));
308308

src/ServiceStack.Text/Common/DeserializeKeyValuePair.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,6 +114,7 @@ public static object ParseKeyValuePairType(string value, Type createMapType, Typ
114114
ParseKeyValuePairType(new StringSegment(value), createMapType, argTypes,
115115
v => keyParseFn(v.Value), v => valueParseFn(v.Value));
116116

117+
static readonly Type[] signature = { typeof(StringSegment), typeof(Type), typeof(ParseStringSegmentDelegate), typeof(ParseStringSegmentDelegate) };
117118

118119
public static object ParseKeyValuePairType(StringSegment value, Type createMapType, Type[] argTypes,
119120
ParseStringSegmentDelegate keyParseFn, ParseStringSegmentDelegate valueParseFn)
@@ -124,8 +125,7 @@ public static object ParseKeyValuePairType(StringSegment value, Type createMapTy
124125
if (ParseDelegateCache.TryGetValue(key, out parseDelegate))
125126
return parseDelegate(value, createMapType, keyParseFn, valueParseFn);
126127

127-
var mi = typeof(DeserializeKeyValuePair<TSerializer>).GetStaticMethod("ParseKeyValuePair",
128-
new [] {typeof(StringSegment), typeof(Type), typeof(ParseStringSegmentDelegate), typeof(ParseStringSegmentDelegate)});
128+
var mi = typeof(DeserializeKeyValuePair<TSerializer>).GetStaticMethod("ParseKeyValuePair", signature);
129129
var genericMi = mi.MakeGenericMethod(argTypes);
130130
parseDelegate = (ParseKeyValuePairDelegate)genericMi.MakeDelegate(typeof(ParseKeyValuePairDelegate));
131131

src/ServiceStack.Text/Common/DeserializeListWithElements.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -42,6 +42,8 @@ public static Func<string, Type, ParseStringDelegate, object> GetListTypeParseFn
4242
return (s, t, d) => func(new StringSegment(s), t, v => d(v.Value));
4343
}
4444

45+
private static readonly Type[] signature = {typeof(StringSegment), typeof(Type), typeof(ParseStringSegmentDelegate)};
46+
4547
public static Func<StringSegment, Type, ParseStringSegmentDelegate, object> GetListTypeParseStringSegmentFn(
4648
Type createListType, Type elementType, ParseStringSegmentDelegate parseFn)
4749
{
@@ -50,7 +52,7 @@ public static Func<StringSegment, Type, ParseStringSegmentDelegate, object> GetL
5052
return parseDelegate.Invoke;
5153

5254
var genericType = typeof(DeserializeListWithElements<,>).MakeGenericType(elementType, typeof(TSerializer));
53-
var mi = genericType.GetStaticMethod("ParseGenericList", new [] {typeof(StringSegment), typeof(Type), typeof(ParseStringSegmentDelegate)});
55+
var mi = genericType.GetStaticMethod("ParseGenericList", signature);
5456
parseDelegate = (ParseListDelegate)mi.MakeDelegate(typeof(ParseListDelegate));
5557

5658
Dictionary<Type, ParseListDelegate> snapshot, newCache;

src/ServiceStack.Text/Json/JsonTypeSerializer.cs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -435,6 +435,7 @@ private static StringSegment UnEscapeJsonString(StringSegment json, ref int inde
435435
{
436436
if (json.IsNullOrEmpty()) return json;
437437
var jsonLength = json.Length;
438+
438439
var firstChar = json.GetChar(index);
439440
if (firstChar == JsonUtils.QuoteChar)
440441
{
@@ -443,13 +444,19 @@ private static StringSegment UnEscapeJsonString(StringSegment json, ref int inde
443444
//MicroOp: See if we can short-circuit evaluation (to avoid StringBuilder)
444445
var strEndPos = json.IndexOfAny(IsSafeJsonChars, index);
445446
if (strEndPos == -1) return json.Subsegment(index, jsonLength - index);
447+
446448
if (json.GetChar(strEndPos) == JsonUtils.QuoteChar)
447449
{
448450
var potentialValue = json.Subsegment(index, strEndPos - index);
449451
index = strEndPos + 1;
450452
return potentialValue;
451453
}
452454
}
455+
else
456+
{
457+
var strEndPos = json.IndexOfAny(IsSafeJsonChars, index);
458+
if (strEndPos == -1) return json.Subsegment(index, jsonLength - index);
459+
}
453460

454461
return Unescape(json);
455462
}

0 commit comments

Comments
 (0)