Index: packages/petitparser/test/json_benchmark.dart |
diff --git a/packages/petitparser/test/json_benchmark.dart b/packages/petitparser/test/json_benchmark.dart |
new file mode 100644 |
index 0000000000000000000000000000000000000000..aca069e3da3a3403b744eb57b2401de7a67b5287 |
--- /dev/null |
+++ b/packages/petitparser/test/json_benchmark.dart |
@@ -0,0 +1,56 @@ |
+library petitparser.test.json_benchmark; |
+ |
+import 'package:petitparser/json.dart'; |
+ |
+import 'dart:convert'; |
+ |
+double benchmark(Function function, [int warmup = 1000, int milliseconds = 5000]) { |
+ var count = 0; |
+ var elapsed = 0; |
+ var watch = new Stopwatch(); |
+ while (warmup-- > 0) { |
+ function(); |
+ } |
+ watch.start(); |
+ while (elapsed < milliseconds) { |
+ function(); |
+ elapsed = watch.elapsedMilliseconds; |
+ count++; |
+ } |
+ return elapsed / count; |
+} |
+ |
+const jsonEvent = '{"type": "change", "eventPhase": 2, "bubbles": true, "cancelable": true, ' |
+ '"timeStamp": 0, "CAPTURING_PHASE": 1, "AT_TARGET": 2, "BUBBLING_PHASE": 3, "isTrusted": ' |
+ 'true, "MOUSEDOWN": 1, "MOUSEUP": 2, "MOUSEOVER": 4, "MOUSEOUT": 8, "MOUSEMOVE": 16, ' |
+ '"MOUSEDRAG": 32, "CLICK": 64, "DBLCLICK": 128, "KEYDOWN": 256, "KEYUP": 512, "KEYPRESS": ' |
+ '1024, "DRAGDROP": 2048, "FOCUS": 4096, "BLUR": 8192, "SELECT": 16384, "CHANGE": 32768, ' |
+ '"RESET": 65536, "SUBMIT": 131072, "SCROLL": 262144, "LOAD": 524288, "UNLOAD": 1048576, ' |
+ '"XFER_DONE": 2097152, "ABORT": 4194304, "ERROR": 8388608, "LOCATE": 16777216, "MOVE": ' |
+ '33554432, "RESIZE": 67108864, "FORWARD": 134217728, "HELP": 268435456, "BACK": 536870912, ' |
+ '"TEXT": 1073741824, "ALT_MASK": 1, "CONTROL_MASK": 2, "SHIFT_MASK": 4, "META_MASK": 8}'; |
+ |
+final JsonParser json = new JsonParser(); |
+ |
+dynamic native(String input) => JSON.decode(input); |
+dynamic custom(String input) => json.parse(input).value; |
+ |
+void main() { |
+ var nativeResult = native(jsonEvent); |
+ var customResult = custom(jsonEvent); |
+ |
+ if (nativeResult.toString() != customResult.toString()) { |
+ print('Results not matching!'); |
+ print(' Native: $nativeResult'); |
+ print(' Custom: $customResult'); |
+ return; |
+ } |
+ |
+ var nativeTime = benchmark(() => native(jsonEvent)); |
+ var customTime = benchmark(() => custom(jsonEvent)); |
+ var ratio = customTime / nativeTime; |
+ |
+ print('Slowdown: ${ratio.toStringAsFixed(1)}'); |
+ print('Native: ${nativeTime.toStringAsFixed(6)}'); |
+ print('Custom: ${customTime.toStringAsFixed(6)}'); |
+} |