Browse Source

Improve JSON.parse and JSON.stringify performance (#358)

Fixes #357
Liangying 8 years ago
parent
commit
89c3c99205
2 changed files with 26 additions and 26 deletions
  1. 13 13
      Jint/Native/Json/JsonParser.cs
  2. 13 13
      Jint/Native/Json/JsonSerializer.cs

+ 13 - 13
Jint/Native/Json/JsonParser.cs

@@ -290,7 +290,7 @@ namespace Jint.Native.Json
 
         private Token ScanStringLiteral()
         {
-            string str = "";
+            var sb = new System.Text.StringBuilder();
 
             char quote = _source.CharCodeAt(_index);
 
@@ -321,13 +321,13 @@ namespace Jint.Native.Json
                         switch (ch)
                         {
                             case 'n':
-                                str += '\n';
+                                sb.Append('\n');
                                 break;
                             case 'r':
-                                str += '\r';
+                                sb.Append('\r');
                                 break;
                             case 't':
-                                str += '\t';
+                                sb.Append('\t');
                                 break;
                             case 'u':
                             case 'x':
@@ -335,22 +335,22 @@ namespace Jint.Native.Json
                                 char unescaped = ScanHexEscape(ch);
                                 if (unescaped > 0)
                                 {
-                                    str += unescaped.ToString();
+                                    sb.Append(unescaped.ToString());
                                 }
                                 else
                                 {
                                     _index = restore;
-                                    str += ch.ToString();
+                                    sb.Append(ch.ToString());
                                 }
                                 break;
                             case 'b':
-                                str += "\b";
+                                sb.Append("\b");
                                 break;
                             case 'f':
-                                str += "\f";
+                                sb.Append("\f");
                                 break;
                             case 'v':
-                                str += "\x0B";
+                                sb.Append("\x0B");
                                 break;
 
                             default:
@@ -371,11 +371,11 @@ namespace Jint.Native.Json
                                             code = code * 8 + "01234567".IndexOf(_source.CharCodeAt(_index++));
                                         }
                                     }
-                                    str += ((char)code).ToString();
+                                    sb.Append(((char)code).ToString());
                                 }
                                 else
                                 {
-                                    str += ch.ToString();
+                                    sb.Append(ch.ToString());
                                 }
                                 break;
                         }
@@ -395,7 +395,7 @@ namespace Jint.Native.Json
                 }
                 else
                 {
-                    str += ch.ToString();
+                    sb.Append(ch.ToString());
                 }
             }
 
@@ -407,7 +407,7 @@ namespace Jint.Native.Json
             return new Token
                 {
                     Type = Tokens.String,
-                    Value = str,
+                    Value = sb.ToString(),
                     LineNumber = _lineNumber,
                     LineStart = _lineStart,
                     Range = new[] {start, _index}

+ 13 - 13
Jint/Native/Json/JsonSerializer.cs

@@ -212,47 +212,47 @@ namespace Jint.Native.Json
 
         private string Quote(string value)
         {
-            var product = "\"";
+            var sb = new System.Text.StringBuilder("\"");
 
             foreach (char c in value)
             {
                 switch (c)
                 {
                     case '\"':
-                        product += "\\\"";
+                        sb.Append("\\\"");
                         break;
                     case '\\':
-                        product += "\\\\";
+                        sb.Append("\\\\");
                         break;
                     case '\b':
-                        product += "\\b";
+                        sb.Append("\\b");
                         break;
                     case '\f':
-                        product += "\\f";
+                        sb.Append("\\f");
                         break;
                     case '\n':
-                        product += "\\n";
+                        sb.Append("\\n");
                         break;
                     case '\r':
-                        product += "\\r";
+                        sb.Append("\\r");
                         break;
                     case '\t':
-                        product += "\\t";
+                        sb.Append("\\t");
                         break;
                     default:
                         if (c < 0x20)
                         {
-                            product += "\\u";
-                            product += ((int) c).ToString("x4");
+                            sb.Append("\\u");
+                            sb.Append(((int) c).ToString("x4"));
                         }
                         else
-                            product += c;
+                            sb.Append(c);
                         break;
                 }
             }
 
-            product += "\"";
-            return product;
+            sb.Append("\"");
+            return sb.ToString();
         }
 
         private string SerializeArray(ArrayInstance value)