From adc72f6d3be5aefe22897fcf1c855fd6025c1793 Mon Sep 17 00:00:00 2001
From: molsonkiko <46202915+molsonkiko@users.noreply.github.com>
Date: Thu, 28 Dec 2023 08:23:22 -0800
Subject: [PATCH] editor.GetText optimizations use C-style pattern of calling
Scintilla method with NULL buffer initially to find length, then
getting a buffer of the length found in the first step also eliminate
wasteful call to TrimEnd('\x00') to reduce pressure on the garbage
collector
---
.../PluginInfrastructure/ScintillaGateway.cs | 39 +++++----
JsonToolsNppPlugin/Properties/AssemblyInfo.cs | 4 +-
most recent errors.txt | 82 +++++++++----------
3 files changed, 68 insertions(+), 57 deletions(-)
diff --git a/JsonToolsNppPlugin/PluginInfrastructure/ScintillaGateway.cs b/JsonToolsNppPlugin/PluginInfrastructure/ScintillaGateway.cs
index b9b7d24..a72c9d9 100644
--- a/JsonToolsNppPlugin/PluginInfrastructure/ScintillaGateway.cs
+++ b/JsonToolsNppPlugin/PluginInfrastructure/ScintillaGateway.cs
@@ -20,6 +20,29 @@ public class ScintillaGateway : IScintillaGateway
public static readonly int LengthZeroTerminator = "\0".Length;
+ ///
+ /// many scintilla methods have a length parameter and a buffer pointer and are bimodal:
+ /// * if length is 0, return the length and have no side effects
+ /// * if length is greater than 0, return the length and fill the buffer with length characters
+ /// This method gets the length if the length is 0, uses the second mode to fill a buffer,
+ /// and returns a string of the UTF8-decoded buffer with all trailing '\x00' chars stripped off.
+ ///
+ /// message to send
+ /// number of characters to retrieve (if 0, find out by sending message)
+ ///
+ private unsafe string GetNullStrippedStringFromMessageThatReturnsLength(SciMsg msg, int length = 0)
+ {
+ if (length < 1)
+ length = Win32.SendMessage(scintilla, msg, (IntPtr)Unused, (IntPtr)Unused).ToInt32();
+ byte[] textBuffer = new byte[length];
+ fixed (byte* textPtr = textBuffer)
+ {
+ Win32.SendMessage(scintilla, msg, (IntPtr)length, (IntPtr)textPtr);
+ int lastNullCharPos = length - 1;
+ for (; lastNullCharPos >= 0 && textBuffer[lastNullCharPos] == '\x00'; lastNullCharPos--) { }
+ return Encoding.UTF8.GetString(textBuffer, 0, lastNullCharPos + 1);
+ }
+ }
public ScintillaGateway(IntPtr scintilla)
{
@@ -1609,12 +1632,7 @@ public void SetSel(int anchor, int caret)
///
public unsafe string GetSelText()
{
- byte[] textBuffer = new byte[10000];
- fixed (byte* textPtr = textBuffer)
- {
- Win32.SendMessage(scintilla, SciMsg.SCI_GETSELTEXT, (IntPtr) Unused, (IntPtr) textPtr);
- return Encoding.UTF8.GetString(textBuffer).TrimEnd('\0');
- }
+ return GetNullStrippedStringFromMessageThatReturnsLength(SciMsg.SCI_GETSELTEXT);
}
///
@@ -1766,14 +1784,7 @@ public unsafe void SetText(string text)
///
public unsafe string GetText(int length = -1)
{
- if (length == -1)
- length = GetLength() + 1;
- byte[] textBuffer = new byte[length];
- fixed (byte* textPtr = textBuffer)
- {
- Win32.SendMessage(scintilla, SciMsg.SCI_GETTEXT, (IntPtr) length, (IntPtr) textPtr);
- return Encoding.UTF8.GetString(textBuffer).TrimEnd('\0');
- }
+ return GetNullStrippedStringFromMessageThatReturnsLength(SciMsg.SCI_GETTEXT);
}
/// Retrieve the number of characters in the document. (Scintilla feature 2183)
diff --git a/JsonToolsNppPlugin/Properties/AssemblyInfo.cs b/JsonToolsNppPlugin/Properties/AssemblyInfo.cs
index a6f4079..d72cf29 100644
--- a/JsonToolsNppPlugin/Properties/AssemblyInfo.cs
+++ b/JsonToolsNppPlugin/Properties/AssemblyInfo.cs
@@ -28,5 +28,5 @@
// Build Number
// Revision
//
-[assembly: AssemblyVersion("6.0.0.10")]
-[assembly: AssemblyFileVersion("6.0.0.10")]
+[assembly: AssemblyVersion("6.0.0.11")]
+[assembly: AssemblyFileVersion("6.0.0.11")]
diff --git a/most recent errors.txt b/most recent errors.txt
index 2c56726..4440964 100644
--- a/most recent errors.txt
+++ b/most recent errors.txt
@@ -1,4 +1,4 @@
-Test results for JsonTools v6.0.0.10 on Notepad++ 8.5.8 64bit
+Test results for JsonTools v6.0.0.11 on Notepad++ 8.5.8 64bit
NOTE: Ctrl-F (regular expressions *on*) for "Failed [1-9]\d*" to find all failed tests
Tests failed: YAML dumper
=========================
@@ -195,33 +195,33 @@ Testing JsonParser performance
Preview of json: [{"A": "Ky'c^g#~)0", "a": 1850111954, "b": 9318359041, "B": "Oyi:/ xxe2", "C": "sKCSa_^7Gg", "c": 7974777124, "d": 2670309238, "D": "0d_K)HmX!.", "E": ".uM*Z{0EJ_", "e": 6958410336, "f": 8050244728, "F": "1%SG_A!xB\t", "g": 3799657125, "G": "il1^k\\\nat*", "H": {"a": 6079042826, "b": 7292804611, "c"
...
-To convert JSON string of size 89556 into JNode took 3.255 +/- 2.247 ms over 32 trials
-Load times (ms): 5, 11, 2, 6, 2, 2, 2, 3, 2, 1, 8, 2, 2, 2, 3, 2, 2, 1, 3, 1, 1, 5, 1, 1, 2, 3, 1, 2, 6, 2, 1, 2
+To convert JSON string of size 89556 into JNode took 2.623 +/- 1.66 ms over 32 trials
+Load times (ms): 4, 9, 1, 4, 1, 1, 1, 3, 1, 1, 4, 1, 1, 1, 3, 1, 1, 4, 1, 1, 1, 2, 1, 1, 4, 2, 1, 2, 4, 1, 1, 1
=========================
Performance tests for RemesPath (float arithmetic)
=========================
-Compiling query "@[@[:].a * @[:].t < @[:].e]" took 0.161 ms the first time, including approximately 0.092 ms to tokenize the query. Subsequent executions are effectively free due to caching.
-To run pre-compiled query "@[@[:].a * @[:].t < @[:].e]" on JNode from JSON of size 89556 into took 0.035 +/- 0.016 ms over 40 trials
-Query times (ms): 0.114, 0.062, 0.043, 0.043, 0.042, 0.044, 0.044, 0.051, 0.044, 0.046, 0.049, 0.024, 0.024, 0.031, 0.025, 0.024, 0.024, 0.024, 0.024, 0.047, 0.04, 0.039, 0.037, 0.04, 0.042, 0.028, 0.023, 0.035, 0.03, 0.027, 0.024, 0.025, 0.023, 0.023, 0.023, 0.022, 0.022, 0.025, 0.023, 0.023
+Compiling query "@[@[:].a * @[:].t < @[:].e]" took 0.055 ms the first time, including approximately 0.067 ms to tokenize the query. Subsequent executions are effectively free due to caching.
+To run pre-compiled query "@[@[:].a * @[:].t < @[:].e]" on JNode from JSON of size 89556 into took 0.029 +/- 0.012 ms over 40 trials
+Query times (ms): 0.082, 0.03, 0.022, 0.033, 0.022, 0.023, 0.023, 0.025, 0.022, 0.029, 0.022, 0.022, 0.022, 0.063, 0.047, 0.034, 0.023, 0.022, 0.023, 0.042, 0.025, 0.036, 0.04, 0.024, 0.024, 0.028, 0.023, 0.023, 0.024, 0.023, 0.022, 0.03, 0.022, 0.023, 0.023, 0.024, 0.022, 0.028, 0.023, 0.023
Preview of result: [{"A": "Ky'c^g#~)0", "a": 1850111954, "b": 9318359041, "B": "Oyi:/ xxe2", "C": "sKCSa_^7Gg", "c": 7974777124, "d": 2670309238, "D": "0d_K)HmX!.", "E": ".uM*Z{0EJ_", "e": 6958410336, "f": 8050244728, "F": "1%SG_A!xB\t", "g": 3799657125, "G": "il1^k\\\nat*", "H": {"a": 6079042826, "b": 7292804611, "c"
...
=========================
Performance tests for RemesPath (string operations)
=========================
-Compiling query "@[@[:].z =~ `(?i)[a-z]{5}`]" took 0.048 ms the first time, including approximately 0.048 ms to tokenize the query. Subsequent executions are effectively free due to caching.
-To run pre-compiled query "@[@[:].z =~ `(?i)[a-z]{5}`]" on JNode from JSON of size 89556 into took 0.062 +/- 0.016 ms over 40 trials
-Query times (ms): 0.128, 0.07, 0.078, 0.097, 0.059, 0.061, 0.058, 0.059, 0.059, 0.058, 0.081, 0.056, 0.054, 0.056, 0.055, 0.056, 0.056, 0.055, 0.057, 0.056, 0.056, 0.055, 0.056, 0.055, 0.056, 0.058, 0.057, 0.057, 0.077, 0.053, 0.055, 0.058, 0.054, 0.054, 0.053, 0.053, 0.054, 0.053, 0.06, 0.105
+Compiling query "@[@[:].z =~ `(?i)[a-z]{5}`]" took 0.052 ms the first time, including approximately 0.08 ms to tokenize the query. Subsequent executions are effectively free due to caching.
+To run pre-compiled query "@[@[:].z =~ `(?i)[a-z]{5}`]" on JNode from JSON of size 89556 into took 0.088 +/- 0.023 ms over 40 trials
+Query times (ms): 0.172, 0.11, 0.102, 0.108, 0.093, 0.094, 0.095, 0.097, 0.094, 0.093, 0.108, 0.09, 0.097, 0.105, 0.081, 0.092, 0.1, 0.111, 0.096, 0.076, 0.097, 0.057, 0.057, 0.06, 0.085, 0.071, 0.09, 0.089, 0.094, 0.074, 0.116, 0.115, 0.098, 0.056, 0.056, 0.056, 0.059, 0.059, 0.062, 0.056
Preview of result: [{"A": "\n]o1VQ5t6g", "a": 4710024278, "b": 3268860721, "B": "g4Y7+ew^.v", "C": "NK nmax_notq, `when q=true, nmax = ` + str(nmax_q), `when q=false, nmax= ` + str(nmax_notq))" took 0.202 ms the first time, including approximately 0.169 ms to tokenize the query. Subsequent executions are effectively free due to caching.
+ifelse(nmax_q > nmax_notq, `when q=true, nmax = ` + str(nmax_q), `when q=false, nmax= ` + str(nmax_notq))" took 0.259 ms the first time, including approximately 0.232 ms to tokenize the query. Subsequent executions are effectively free due to caching.
To run pre-compiled query "var qmask = @[:].q;
var nmax_q = max(@[qmask].n);
var nmax_notq = max(@[not qmask].n);
-ifelse(nmax_q > nmax_notq, `when q=true, nmax = ` + str(nmax_q), `when q=false, nmax= ` + str(nmax_notq))" on JNode from JSON of size 89556 into took 0.036 +/- 0.018 ms over 40 trials
-Query times (ms): 0.117, 0.035, 0.033, 0.039, 0.044, 0.04, 0.04, 0.051, 0.036, 0.033, 0.035, 0.036, 0.034, 0.065, 0.036, 0.038, 0.039, 0.039, 0.047, 0.025, 0.069, 0.026, 0.024, 0.023, 0.024, 0.023, 0.042, 0.05, 0.025, 0.061, 0.021, 0.021, 0.023, 0.02, 0.02, 0.019, 0.02, 0.019, 0.02, 0.019
+ifelse(nmax_q > nmax_notq, `when q=true, nmax = ` + str(nmax_q), `when q=false, nmax= ` + str(nmax_notq))" on JNode from JSON of size 89556 into took 0.047 +/- 0.071 ms over 40 trials
+Query times (ms): 0.148, 0.039, 0.03, 0.044, 0.033, 0.057, 0.041, 0.033, 0.032, 0.03, 0.028, 0.03, 0.031, 0.03, 0.026, 0.027, 0.027, 0.027, 0.039, 0.029, 0.028, 0.028, 0.027, 0.027, 0.028, 0.028, 0.027, 0.028, 0.027, 0.028, 0.029, 0.048, 0.031, 0.474, 0.07, 0.028, 0.028, 0.031, 0.031, 0.053
Preview of result: "when q=false, nmax= 9830935647.0"
...
=========================
@@ -260,11 +260,11 @@ Performance tests for RemesPath (references to compile-time constant variables)
Compiling query "var X = X;
var onetwo = j`[1, 2]`;
-@[:]->at(@, X)->at(@, onetwo)" took 0.131 ms the first time, including approximately 0.484 ms to tokenize the query. Subsequent executions are effectively free due to caching.
+@[:]->at(@, X)->at(@, onetwo)" took 0.144 ms the first time, including approximately 0.12 ms to tokenize the query. Subsequent executions are effectively free due to caching.
To run pre-compiled query "var X = X;
var onetwo = j`[1, 2]`;
-@[:]->at(@, X)->at(@, onetwo)" on JNode from JSON of size 89556 into took 0.029 +/- 0.024 ms over 40 trials
-Query times (ms): 0.106, 0.028, 0.028, 0.023, 0.088, 0.017, 0.058, 0.028, 0.055, 0.04, 0.015, 0.014, 0.015, 0.014, 0.015, 0.014, 0.014, 0.014, 0.015, 0.015, 0.04, 0.03, 0.025, 0.028, 0.027, 0.027, 0.026, 0.026, 0.026, 0.026, 0.026, 0.114, 0.022, 0.013, 0.014, 0.014, 0.014, 0.014, 0.014, 0.014
+@[:]->at(@, X)->at(@, onetwo)" on JNode from JSON of size 89556 into took 0.022 +/- 0.014 ms over 40 trials
+Query times (ms): 0.071, 0.014, 0.015, 0.013, 0.015, 0.077, 0.039, 0.014, 0.041, 0.013, 0.025, 0.017, 0.014, 0.026, 0.014, 0.014, 0.014, 0.013, 0.013, 0.013, 0.02, 0.026, 0.024, 0.029, 0.027, 0.015, 0.014, 0.013, 0.015, 0.016, 0.014, 0.025, 0.037, 0.027, 0.026, 0.021, 0.013, 0.014, 0.013, 0.014
Preview of result: [[1695727848, 0.287562638736685], [2126430375, 0.00767794129708177], [5310550656, 0.380769772645687], [2519183283, 0.153176220930558], [6610062385, 0.662996225870666], [987168256, 0.924410189999928], [6615003609, 0.917112691225947], [4465232046, 0.684311931851536], [8654414565, 0.631485392105992], [
...
=========================
@@ -273,29 +273,29 @@ Performance tests for RemesPath (references to variables that are not compile-ti
Compiling query "var X = @->`X`;
var onetwo = @{1, 2};
-@[:]->at(@, X)->at(@, onetwo)" took 0.1 ms the first time, including approximately 0.095 ms to tokenize the query. Subsequent executions are effectively free due to caching.
+@[:]->at(@, X)->at(@, onetwo)" took 0.242 ms the first time, including approximately 0.138 ms to tokenize the query. Subsequent executions are effectively free due to caching.
To run pre-compiled query "var X = @->`X`;
var onetwo = @{1, 2};
-@[:]->at(@, X)->at(@, onetwo)" on JNode from JSON of size 89556 into took 0.031 +/- 0.014 ms over 40 trials
-Query times (ms): 0.071, 0.02, 0.045, 0.035, 0.036, 0.044, 0.031, 0.054, 0.037, 0.065, 0.034, 0.058, 0.037, 0.039, 0.04, 0.021, 0.019, 0.019, 0.019, 0.019, 0.018, 0.02, 0.02, 0.018, 0.019, 0.019, 0.019, 0.019, 0.018, 0.018, 0.018, 0.047, 0.034, 0.026, 0.02, 0.032, 0.038, 0.035, 0.033, 0.02
+@[:]->at(@, X)->at(@, onetwo)" on JNode from JSON of size 89556 into took 0.032 +/- 0.018 ms over 40 trials
+Query times (ms): 0.11, 0.019, 0.024, 0.031, 0.081, 0.05, 0.059, 0.032, 0.041, 0.034, 0.032, 0.03, 0.034, 0.035, 0.035, 0.032, 0.031, 0.03, 0.04, 0.032, 0.017, 0.017, 0.016, 0.026, 0.032, 0.032, 0.032, 0.029, 0.019, 0.017, 0.018, 0.018, 0.016, 0.026, 0.02, 0.017, 0.019, 0.018, 0.031, 0.033
Preview of result: [[1695727848, 0.287562638736685], [2126430375, 0.00767794129708177], [5310550656, 0.380769772645687], [2519183283, 0.153176220930558], [6610062385, 0.662996225870666], [987168256, 0.924410189999928], [6615003609, 0.917112691225947], [4465232046, 0.684311931851536], [8654414565, 0.631485392105992], [
...
=========================
Performance tests for RemesPath (simple string mutations)
=========================
-Compiling query "@[:].z = s_sub(@, g, B)" took 0.076 ms the first time, including approximately 0.086 ms to tokenize the query. Subsequent executions are effectively free due to caching.
-To run pre-compiled query "@[:].z = s_sub(@, g, B)" on JNode from JSON of size 89556 into took 0.038 +/- 0.04 ms over 40 trials
-Query times (ms): 0.062, 0.03, 0.044, 0.014, 0.018, 0.029, 0.029, 0.042, 0.038, 0.043, 0.025, 0.018, 0.015, 0.014, 0.016, 0.037, 0.023, 0.02, 0.026, 0.026, 0.021, 0.026, 0.021, 0.102, 0.025, 0.267, 0.033, 0.03, 0.047, 0.035, 0.026, 0.035, 0.033, 0.034, 0.033, 0.029, 0.054, 0.031, 0.025, 0.029
+Compiling query "@[:].z = s_sub(@, g, B)" took 0.076 ms the first time, including approximately 0.106 ms to tokenize the query. Subsequent executions are effectively free due to caching.
+To run pre-compiled query "@[:].z = s_sub(@, g, B)" on JNode from JSON of size 89556 into took 0.031 +/- 0.009 ms over 40 trials
+Query times (ms): 0.045, 0.031, 0.018, 0.028, 0.043, 0.028, 0.037, 0.037, 0.023, 0.036, 0.019, 0.025, 0.019, 0.028, 0.039, 0.018, 0.016, 0.015, 0.053, 0.038, 0.026, 0.024, 0.023, 0.025, 0.024, 0.033, 0.034, 0.031, 0.041, 0.03, 0.027, 0.034, 0.028, 0.03, 0.029, 0.039, 0.039, 0.042, 0.041, 0.037
Preview of result: [{"A": "Ky'c^g#~)0", "a": 1850111954, "b": 9318359041, "B": "Oyi:/ xxe2", "C": "sKCSa_^7Gg", "c": 7974777124, "d": 2670309238, "D": "0d_K)HmX!.", "E": ".uM*Z{0EJ_", "e": 6958410336, "f": 8050244728, "F": "1%SG_A!xB\t", "g": 3799657125, "G": "il1^k\\\nat*", "H": {"a": 6079042826, "b": 7292804611, "c"
...
=========================
Performance tests for RemesPath (simple number mutations)
=========================
-Compiling query "@[:].x = ifelse(@ < 0.5, @ + 3, @ - 3)" took 0.148 ms the first time, including approximately 0.131 ms to tokenize the query. Subsequent executions are effectively free due to caching.
-To run pre-compiled query "@[:].x = ifelse(@ < 0.5, @ + 3, @ - 3)" on JNode from JSON of size 89556 into took 0.105 +/- 0.378 ms over 40 trials
-Query times (ms): 0.088, 0.042, 0.036, 0.04, 0.04, 0.042, 0.047, 0.051, 0.045, 0.04, 0.038, 0.038, 0.069, 2.464, 0.031, 0.043, 0.024, 0.032, 0.037, 0.032, 0.04, 0.031, 0.023, 0.024, 0.023, 0.063, 0.093, 0.058, 0.042, 0.046, 0.049, 0.048, 0.049, 0.047, 0.05, 0.047, 0.042, 0.045, 0.038, 0.05
+Compiling query "@[:].x = ifelse(@ < 0.5, @ + 3, @ - 3)" took 0.244 ms the first time, including approximately 0.121 ms to tokenize the query. Subsequent executions are effectively free due to caching.
+To run pre-compiled query "@[:].x = ifelse(@ < 0.5, @ + 3, @ - 3)" on JNode from JSON of size 89556 into took 0.055 +/- 0.025 ms over 40 trials
+Query times (ms): 0.061, 0.06, 0.057, 0.054, 0.047, 0.037, 0.04, 0.046, 0.043, 0.039, 0.038, 0.038, 0.063, 0.06, 0.058, 0.052, 0.044, 0.04, 0.051, 0.049, 0.05, 0.051, 0.05, 0.049, 0.057, 0.089, 0.056, 0.041, 0.042, 0.04, 0.04, 0.043, 0.047, 0.051, 0.041, 0.044, 0.056, 0.154, 0.157, 0.067
Preview of result: [{"A": "Ky'c^g#~)0", "a": 1850111954, "b": 9318359041, "B": "Oyi:/ xxe2", "C": "sKCSa_^7Gg", "c": 7974777124, "d": 2670309238, "D": "0d_K)HmX!.", "E": ".uM*Z{0EJ_", "e": 6958410336, "f": 8050244728, "F": "1%SG_A!xB\t", "g": 3799657125, "G": "il1^k\\\nat*", "H": {"a": 6079042826, "b": 7292804611, "c"
...
=========================
@@ -305,12 +305,12 @@ Performance tests for RemesPath (mutations with a for loop)
Compiling query "var xhalf = @[:].x < 0.5;
for lx = zip(@[:].l, xhalf);
lx[0] = ifelse(lx[1], foo, bar);
-end for;" took 0.179 ms the first time, including approximately 0.137 ms to tokenize the query. Subsequent executions are effectively free due to caching.
+end for;" took 0.31 ms the first time, including approximately 0.208 ms to tokenize the query. Subsequent executions are effectively free due to caching.
To run pre-compiled query "var xhalf = @[:].x < 0.5;
for lx = zip(@[:].l, xhalf);
lx[0] = ifelse(lx[1], foo, bar);
-end for;" on JNode from JSON of size 89556 into took 0.05 +/- 0.015 ms over 40 trials
-Query times (ms): 0.074, 0.049, 0.042, 0.042, 0.041, 0.076, 0.04, 0.037, 0.04, 0.058, 0.099, 0.089, 0.042, 0.051, 0.047, 0.039, 0.038, 0.042, 0.062, 0.039, 0.038, 0.04, 0.044, 0.063, 0.054, 0.04, 0.038, 0.039, 0.063, 0.042, 0.074, 0.052, 0.041, 0.041, 0.038, 0.072, 0.047, 0.042, 0.04, 0.054
+end for;" on JNode from JSON of size 89556 into took 0.095 +/- 0.023 ms over 40 trials
+Query times (ms): 0.108, 0.082, 0.075, 0.136, 0.131, 0.103, 0.089, 0.087, 0.078, 0.074, 0.099, 0.078, 0.099, 0.087, 0.052, 0.104, 0.058, 0.047, 0.078, 0.126, 0.109, 0.119, 0.127, 0.117, 0.082, 0.083, 0.085, 0.095, 0.076, 0.08, 0.11, 0.124, 0.128, 0.133, 0.116, 0.076, 0.109, 0.098, 0.07, 0.067
Preview of result: [["bar", false], ["bar", false], ["foo", true], ["foo", true], ["foo", true], ["foo", true], ["foo", true], ["bar", false], ["bar", false], ["bar", false], ["foo", true], ["foo", true], ["bar", false], ["bar", false], ["foo", true], ["bar", false], ["bar", false], ["bar", false], ["foo", true], ["ba
...
=========================
@@ -319,18 +319,18 @@ Testing performance of JSON compression and pretty-printing
Preview of json: [{"A": "Ky'c^g#~)0", "a": 1850111954, "b": 9318359041, "B": "Oyi:/ xxe2", "C": "sKCSa_^7Gg", "c": 7974777124, "d": 2670309238, "D": "0d_K)HmX!.", "E": ".uM*Z{0EJ_", "e": 6958410336, "f": 8050244728, "F": "1%SG_A!xB\t", "g": 3799657125, "G": "il1^k\\\nat*", "H": {"a": 6079042826, "b": 7292804611, "c"
...
-To compress JNode from JSON string of 89556 took 6.481 +/- 2.535 ms over 64 trials (minimal whitespace, sort_keys=TRUE)
-To compress JNode from JSON string of 89556 took 4.461 +/- 1.202 ms over 64 trials (minimal whitespace, sort_keys=FALSE)
-To Google-style pretty-print JNode from JSON string of 89556 took 6.406 +/- 2.348 ms over 64 trials (sort_keys=true, indent=4)
-To Whitesmith-style pretty-print JNode from JSON string of 89556 took 5.361 +/- 1.132 ms over 64 trials (sort_keys=true, indent=4)
-To PPrint-style pretty-print JNode from JSON string of 89556 took 6.306 +/- 0.703 ms over 64 trials (sort_keys=true, indent=4)
+To compress JNode from JSON string of 89556 took 5.053 +/- 1.154 ms over 64 trials (minimal whitespace, sort_keys=TRUE)
+To compress JNode from JSON string of 89556 took 2.442 +/- 0.368 ms over 64 trials (minimal whitespace, sort_keys=FALSE)
+To Google-style pretty-print JNode from JSON string of 89556 took 4.202 +/- 0.333 ms over 64 trials (sort_keys=true, indent=4)
+To Whitesmith-style pretty-print JNode from JSON string of 89556 took 4.483 +/- 0.641 ms over 64 trials (sort_keys=true, indent=4)
+To PPrint-style pretty-print JNode from JSON string of 89556 took 6.142 +/- 0.954 ms over 64 trials (sort_keys=true, indent=4)
=========================
Testing performance of JsonSchemaValidator and random JSON creation
=========================
-To create a random set of tweet JSON of size 187795 (15 tweets) based on the matching schema took 6.669 +/- 3.603 ms over 64 trials
-To compile the tweet schema to a validation function took 0.412 +/- 0.966 ms over 64 trials
-To validate tweet JSON of size 187795 (15 tweets) based on the compiled schema took 1.073 +/- 0.204 ms over 64 trials
+To create a random set of tweet JSON of size 191443 (15 tweets) based on the matching schema took 5.942 +/- 2.898 ms over 64 trials
+To compile the tweet schema to a validation function took 0.45 +/- 0.97 ms over 64 trials
+To validate tweet JSON of size 191443 (15 tweets) based on the compiled schema took 1.047 +/- 0.178 ms over 64 trials
=========================
Testing JSON grepper's API request tool
=========================