-Performance improvements

This commit is contained in:
JamesNK
2012-01-08 00:54:53 +00:00
parent 1bd20261c2
commit 90297804e1
9 changed files with 149 additions and 98 deletions
@@ -93,8 +93,8 @@ namespace Newtonsoft.Json.Converters
private object ReadBson(BsonReader reader)
{
string regexText = (string)reader.Value;
int patternOptionDelimiterIndex = regexText.LastIndexOf(@"/");
string regexText = (string) reader.Value;
int patternOptionDelimiterIndex = regexText.LastIndexOf('/');
string patternText = regexText.Substring(1, patternOptionDelimiterIndex - 1);
string optionsText = regexText.Substring(patternOptionDelimiterIndex + 1);
@@ -134,7 +134,7 @@ namespace Newtonsoft.Json.Converters
reader.Read();
return new Regex(pattern, (RegexOptions)options);
return new Regex(pattern, (RegexOptions) options);
}
/// <summary>
@@ -149,4 +149,4 @@ namespace Newtonsoft.Json.Converters
return (objectType == typeof (Regex));
}
}
}
}
+25 -25
View File
@@ -119,7 +119,7 @@ namespace Newtonsoft.Json
writer.Write(@"""\/Date(");
writer.Write(javaScriptTicks);
switch (kind)
{
case DateTimeKind.Local:
@@ -184,14 +184,14 @@ namespace Newtonsoft.Json
private static long UniversialTicksToJavaScriptTicks(long universialTicks)
{
long javaScriptTicks = (universialTicks - InitialJavaScriptDateTicks) / 10000;
long javaScriptTicks = (universialTicks - InitialJavaScriptDateTicks)/10000;
return javaScriptTicks;
}
internal static DateTime ConvertJavaScriptTicksToDateTime(long javaScriptTicks)
{
DateTime dateTime = new DateTime((javaScriptTicks * 10000) + InitialJavaScriptDateTicks, DateTimeKind.Utc);
DateTime dateTime = new DateTime((javaScriptTicks*10000) + InitialJavaScriptDateTicks, DateTimeKind.Utc);
return dateTime;
}
@@ -311,7 +311,7 @@ namespace Newtonsoft.Json
private static string EnsureDecimalPlace(double value, string text)
{
if (double.IsNaN(value) || double.IsInfinity(value) || text.IndexOf('.') != -1 || text.IndexOf('E') != -1)
if (double.IsNaN(value) || double.IsInfinity(value) || text.IndexOf('.') != -1 || text.IndexOf('E') != -1 || text.IndexOf('e') != -1)
return text;
return text + ".0";
@@ -463,7 +463,7 @@ namespace Newtonsoft.Json
#if !PocketPC && !NET20
else if (value is DateTimeOffset)
{
return ToString((DateTimeOffset)value);
return ToString((DateTimeOffset) value);
}
#endif
else if (value is Guid)
@@ -514,16 +514,16 @@ namespace Newtonsoft.Json
type = Nullable.GetUnderlyingType(type);
#if !PocketPC && !NET20
if (type == typeof(DateTimeOffset))
if (type == typeof (DateTimeOffset))
return true;
#endif
if (type == typeof(byte[]))
if (type == typeof (byte[]))
return true;
if (type == typeof(Uri))
if (type == typeof (Uri))
return true;
if (type == typeof(TimeSpan))
if (type == typeof (TimeSpan))
return true;
if (type == typeof(Guid))
if (type == typeof (Guid))
return true;
return IsJsonPrimitiveTypeCode(Type.GetTypeCode(type));
@@ -562,7 +562,7 @@ namespace Newtonsoft.Json
/// <returns>A JSON string representation of the object.</returns>
public static string SerializeObject(object value)
{
return SerializeObject(value, Formatting.None, (JsonSerializerSettings)null);
return SerializeObject(value, Formatting.None, (JsonSerializerSettings) null);
}
/// <summary>
@@ -575,7 +575,7 @@ namespace Newtonsoft.Json
/// </returns>
public static string SerializeObject(object value, Formatting formatting)
{
return SerializeObject(value, formatting, (JsonSerializerSettings)null);
return SerializeObject(value, formatting, (JsonSerializerSettings) null);
}
/// <summary>
@@ -599,8 +599,8 @@ namespace Newtonsoft.Json
public static string SerializeObject(object value, Formatting formatting, params JsonConverter[] converters)
{
JsonSerializerSettings settings = (converters != null && converters.Length > 0)
? new JsonSerializerSettings { Converters = converters }
: null;
? new JsonSerializerSettings {Converters = converters}
: null;
return SerializeObject(value, formatting, settings);
}
@@ -638,7 +638,7 @@ namespace Newtonsoft.Json
/// <returns>The deserialized object from the Json string.</returns>
public static object DeserializeObject(string value)
{
return DeserializeObject(value, null, (JsonSerializerSettings)null);
return DeserializeObject(value, null, (JsonSerializerSettings) null);
}
/// <summary>
@@ -663,7 +663,7 @@ namespace Newtonsoft.Json
/// <returns>The deserialized object from the Json string.</returns>
public static object DeserializeObject(string value, Type type)
{
return DeserializeObject(value, type, (JsonSerializerSettings)null);
return DeserializeObject(value, type, (JsonSerializerSettings) null);
}
/// <summary>
@@ -674,7 +674,7 @@ namespace Newtonsoft.Json
/// <returns>The deserialized object from the Json string.</returns>
public static T DeserializeObject<T>(string value)
{
return DeserializeObject<T>(value, (JsonSerializerSettings)null);
return DeserializeObject<T>(value, (JsonSerializerSettings) null);
}
/// <summary>
@@ -702,7 +702,7 @@ namespace Newtonsoft.Json
/// <returns>The deserialized object from the JSON string.</returns>
public static T DeserializeObject<T>(string value, params JsonConverter[] converters)
{
return (T)DeserializeObject(value, typeof(T), converters);
return (T) DeserializeObject(value, typeof (T), converters);
}
/// <summary>
@@ -717,7 +717,7 @@ namespace Newtonsoft.Json
/// <returns>The deserialized object from the JSON string.</returns>
public static T DeserializeObject<T>(string value, JsonSerializerSettings settings)
{
return (T)DeserializeObject(value, typeof(T), settings);
return (T) DeserializeObject(value, typeof (T), settings);
}
/// <summary>
@@ -730,8 +730,8 @@ namespace Newtonsoft.Json
public static object DeserializeObject(string value, Type type, params JsonConverter[] converters)
{
JsonSerializerSettings settings = (converters != null && converters.Length > 0)
? new JsonSerializerSettings { Converters = converters }
: null;
? new JsonSerializerSettings {Converters = converters}
: null;
return DeserializeObject(value, type, settings);
}
@@ -831,7 +831,7 @@ namespace Newtonsoft.Json
/// <returns>A JSON string of the XmlNode.</returns>
public static string SerializeXmlNode(XmlNode node, Formatting formatting, bool omitRootObject)
{
XmlNodeConverter converter = new XmlNodeConverter { OmitRootObject = omitRootObject };
XmlNodeConverter converter = new XmlNodeConverter {OmitRootObject = omitRootObject};
return SerializeObject(node, formatting, converter);
}
@@ -873,7 +873,7 @@ namespace Newtonsoft.Json
converter.DeserializeRootElementName = deserializeRootElementName;
converter.WriteArrayAttribute = writeArrayAttribute;
return (XmlDocument)DeserializeObject(value, typeof(XmlDocument), converter);
return (XmlDocument) DeserializeObject(value, typeof (XmlDocument), converter);
}
#endif
@@ -908,7 +908,7 @@ namespace Newtonsoft.Json
/// <returns>A JSON string of the XNode.</returns>
public static string SerializeXNode(XObject node, Formatting formatting, bool omitRootObject)
{
XmlNodeConverter converter = new XmlNodeConverter { OmitRootObject = omitRootObject };
XmlNodeConverter converter = new XmlNodeConverter {OmitRootObject = omitRootObject};
return SerializeObject(node, formatting, converter);
}
@@ -950,7 +950,7 @@ namespace Newtonsoft.Json
converter.DeserializeRootElementName = deserializeRootElementName;
converter.WriteArrayAttribute = writeArrayAttribute;
return (XDocument)DeserializeObject(value, typeof(XDocument), converter);
return (XDocument) DeserializeObject(value, typeof (XDocument), converter);
}
#endif
}
+2
View File
@@ -458,7 +458,9 @@ namespace Newtonsoft.Json
internal static JsonConverter GetMatchingConverter(IList<JsonConverter> converters, Type objectType)
{
#if DEBUG
ValidationUtils.ArgumentNotNull(objectType, "objectType");
#endif
if (converters != null)
{
+33 -21
View File
@@ -112,7 +112,7 @@ namespace Newtonsoft.Json
{
SetToken(JsonToken.String, text);
QuoteChar = quote;
}
}
}
}
@@ -216,7 +216,7 @@ namespace Newtonsoft.Json
TimeSpan offset = TimeSpan.FromHours(hours) + TimeSpan.FromMinutes(minutes);
if (negative)
offset = offset.Negate();
return offset;
}
@@ -298,7 +298,7 @@ namespace Newtonsoft.Json
break;
}
return (char)value;
return (char) value;
}
private bool HasNext()
@@ -417,20 +417,20 @@ namespace Newtonsoft.Json
public override decimal? ReadAsDecimal()
{
_readType = ReadType.ReadAsDecimal;
do
{
if (!ReadInternal())
throw CreateJsonReaderException("Unexpected end when reading decimal: Line {0}, position {1}.", _currentLineNumber, _currentLinePosition);
} while (TokenType == JsonToken.Comment);
if (TokenType == JsonToken.Null)
return null;
if (TokenType == JsonToken.Float)
return (decimal?)Value;
return (decimal?) Value;
decimal d;
if (TokenType == JsonToken.String && decimal.TryParse((string)Value, NumberStyles.Number, Culture, out d))
if (TokenType == JsonToken.String && decimal.TryParse((string) Value, NumberStyles.Number, Culture, out d))
{
SetToken(JsonToken.Float, d);
return d;
@@ -457,10 +457,10 @@ namespace Newtonsoft.Json
if (TokenType == JsonToken.Null)
return null;
if (TokenType == JsonToken.Date)
return (DateTimeOffset)Value;
return (DateTimeOffset) Value;
DateTimeOffset dt;
if (TokenType == JsonToken.String && DateTimeOffset.TryParse((string)Value, Culture, DateTimeStyles.None, out dt))
if (TokenType == JsonToken.String && DateTimeOffset.TryParse((string) Value, Culture, DateTimeStyles.None, out dt))
{
SetToken(JsonToken.Date, dt);
return dt;
@@ -685,7 +685,7 @@ namespace Newtonsoft.Json
case 'n':
if (HasNext())
{
char next = (char)PeekNext();
char next = (char) PeekNext();
if (next == 'u')
ParseNull();
@@ -828,16 +828,22 @@ namespace Newtonsoft.Json
object numberValue;
JsonToken numberType;
bool nonBase10 = (firstChar == '0' && !number.StartsWith("0.", StringComparison.OrdinalIgnoreCase));
bool singleDigit = (char.IsDigit(firstChar) && number.Length == 1);
bool nonBase10 = (firstChar == '0' && number.Length > 1 && number[1] != '.');
if (_readType == ReadType.ReadAsDecimal)
{
if (nonBase10)
if (singleDigit)
{
// digit char values start at 48
numberValue = (decimal)firstChar - 48;
}
else if (nonBase10)
{
// decimal.Parse doesn't support parsing hexadecimal values
long integer = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase)
? Convert.ToInt64(number, 16)
: Convert.ToInt64(number, 8);
? Convert.ToInt64(number, 16)
: Convert.ToInt64(number, 8);
numberValue = Convert.ToDecimal(integer);
}
@@ -850,14 +856,21 @@ namespace Newtonsoft.Json
}
else
{
if (nonBase10)
if (singleDigit)
{
numberValue = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase)
? Convert.ToInt64(number, 16)
: Convert.ToInt64(number, 8);
// digit char values start at 48
numberValue = (long)firstChar - 48;
numberType = JsonToken.Integer;
}
else if (number.IndexOf(".", StringComparison.OrdinalIgnoreCase) != -1 || number.IndexOf("e", StringComparison.OrdinalIgnoreCase) != -1)
else if (nonBase10)
{
numberValue = number.StartsWith("0x", StringComparison.OrdinalIgnoreCase)
? Convert.ToInt64(number, 16)
: Convert.ToInt64(number, 8);
numberType = JsonToken.Integer;
}
// it's faster to do 3 indexof with single characters than an indexofany
else if (number.IndexOf('.') != -1 || number.IndexOf('E') != -1 || number.IndexOf('e') != -1)
{
numberValue = Convert.ToDouble(number, CultureInfo.InvariantCulture);
numberType = JsonToken.Float;
@@ -935,8 +948,7 @@ namespace Newtonsoft.Json
break;
}
i++;
}
while (i < value.Length && ((currentChar = MoveNext()) != '\0' || !_end));
} while (i < value.Length && ((currentChar = MoveNext()) != '\0' || !_end));
return (i == value.Length);
}
+7 -10
View File
@@ -211,17 +211,14 @@ namespace Newtonsoft.Json
/// </summary>
protected override void WriteIndent()
{
if (Formatting == Formatting.Indented)
_writer.Write(Environment.NewLine);
// levels of indentation multiplied by the indent count
int currentIndentCount = Top*_indentation;
for (int i = 0; i < currentIndentCount; i++)
{
_writer.Write(Environment.NewLine);
// levels of indentation multiplied by the indent count
int currentIndentCount = Top * _indentation;
for (int i = 0; i < currentIndentCount; i++)
{
_writer.Write(_indentChar);
}
_writer.Write(_indentChar);
}
}
+15 -9
View File
@@ -522,8 +522,11 @@ namespace Newtonsoft.Json
{
JsonToken token = GetCloseTokenForType(Pop());
if (_currentState != State.ObjectStart && _currentState != State.ArrayStart)
WriteIndent();
if (_formatting == Formatting.Indented)
{
if (_currentState != State.ObjectStart && _currentState != State.ArrayStart)
WriteIndent();
}
WriteEnd(token);
}
@@ -616,13 +619,16 @@ namespace Newtonsoft.Json
WriteIndentSpace();
}
WriteState writeState = WriteState;
// don't indent a property when it is the first token to be written (i.e. at the start)
if ((tokenBeingWritten == JsonToken.PropertyName && writeState != WriteState.Start) ||
writeState == WriteState.Array || writeState == WriteState.Constructor)
if (_formatting == Formatting.Indented)
{
WriteIndent();
WriteState writeState = WriteState;
// don't indent a property when it is the first token to be written (i.e. at the start)
if ((tokenBeingWritten == JsonToken.PropertyName && writeState != WriteState.Start) ||
writeState == WriteState.Array || writeState == WriteState.Constructor)
{
WriteIndent();
}
}
_currentState = newState;
@@ -1196,7 +1202,7 @@ namespace Newtonsoft.Json
private void Dispose(bool disposing)
{
if (WriteState != WriteState.Closed)
if (_currentState != State.Closed)
Close();
}
}
@@ -43,7 +43,7 @@ namespace Newtonsoft.Json.Serialization
/// Initializes a new instance of the <see cref="JsonPropertyCollection"/> class.
/// </summary>
/// <param name="type">The type.</param>
public JsonPropertyCollection(Type type)
public JsonPropertyCollection(Type type) : base(StringComparer.Ordinal)
{
ValidationUtils.ArgumentNotNull(type, "type");
_type = type;
@@ -100,6 +100,18 @@ namespace Newtonsoft.Json.Serialization
return property;
}
private bool TryGetValue(string key, out JsonProperty item)
{
if (Dictionary == null)
{
item = default(JsonProperty);
return false;
}
return Dictionary.TryGetValue(key, out item);
}
/// <summary>
/// Gets a property by property name.
/// </summary>
@@ -108,6 +120,16 @@ namespace Newtonsoft.Json.Serialization
/// <returns>A matching property if found.</returns>
public JsonProperty GetProperty(string propertyName, StringComparison comparisonType)
{
// KeyedCollection has an ordinal comparer
if (comparisonType == StringComparison.Ordinal)
{
JsonProperty property;
if (TryGetValue(propertyName, out property))
return property;
return null;
}
foreach (JsonProperty property in this)
{
if (string.Equals(propertyName, property.PropertyName, comparisonType))
@@ -480,7 +480,7 @@ namespace Newtonsoft.Json.Serialization
private bool HasDefinedType(Type type)
{
return (type != null && type != typeof (object) && !typeof (JToken).IsAssignableFrom(type)
return (type != null && type != typeof (object) && !typeof (JToken).IsSubclassOf(type)
#if !(NET35 || NET20 || WINDOWS_PHONE)
&& type != typeof (IDynamicMetaObjectProvider)
#endif
@@ -35,21 +35,29 @@ namespace Newtonsoft.Json.Utilities
{
internal static class JavaScriptUtils
{
public static void WriteEscapedJavaScriptString(TextWriter writer, string value, char delimiter, bool appendDelimiters)
public static void WriteEscapedJavaScriptString(TextWriter writer, string s, char delimiter, bool appendDelimiters)
{
// leading delimiter
if (appendDelimiters)
writer.Write(delimiter);
if (value != null)
if (s != null)
{
int lastWritePosition = 0;
int skipped = 0;
char[] chars = null;
int lastWritePosition = -1;
for (int i = 0; i < value.Length; i++)
for (var index = 0; index < s.Length; ++index)
{
char c = value[i];
var c = s[index];
if (c >= ' ' && c < 128 && c != '\"' && c != '\\' && c != '\'')
{
if (lastWritePosition == -1)
lastWritePosition = index;
continue;
}
string escapedValue;
switch (c)
@@ -94,35 +102,39 @@ namespace Newtonsoft.Json.Utilities
break;
}
if (escapedValue != null)
if (escapedValue == null)
{
if (lastWritePosition == -1)
lastWritePosition = index;
continue;
}
if (lastWritePosition != -1)
{
if (chars == null)
chars = value.ToCharArray();
chars = s.ToCharArray();
// write skipped text
if (skipped > 0)
{
writer.Write(chars, lastWritePosition, skipped);
skipped = 0;
}
writer.Write(chars, lastWritePosition, index - lastWritePosition);
lastWritePosition = -1;
}
// write escaped value and note position
writer.Write(escapedValue);
lastWritePosition = i + 1;
writer.Write(escapedValue);
}
if (lastWritePosition != -1)
{
if (lastWritePosition == 0)
{
writer.Write(s);
}
else
{
skipped++;
}
}
if (chars == null)
chars = s.ToCharArray();
// write any remaining skipped text
if (skipped > 0)
{
if (lastWritePosition == 0)
writer.Write(value);
else
writer.Write(chars, lastWritePosition, skipped);
writer.Write(chars, lastWritePosition, s.Length - lastWritePosition);
}
}
}