util: improve inspect performance
I reworked a couple of things in util inspect for performance. The code is fully covered.
EDIT: Updated the comment here and benchmarks.
util/format.js type="no-replace" n=2000000 1676.61 % *** 6.038361e-60
util/inspect-array.js type="denseArray_showHidden" len=100000 n=1000 87.89 % *** 3.315801e-79
util/inspect-array.js type="denseArray" len=100000 n=1000 68.83 % *** 5.648717e-52
util/inspect-array.js type="mixedArray" len=100000 n=1000 21.22 % *** 2.438066e-52
util/inspect-array.js type="sparseArray" len=100000 n=1000 6.87 % *** 9.551672e-50
util/inspect-proxy.js n=1000000 418.34 % *** 5.193464e-71
util/inspect.js option="colors" method="Array" n=2000000 121.92 % *** 1.136217e-39
util/inspect.js option="colors" method="Date" n=2000000 294.42 % *** 3.899375e-18
util/inspect.js option="colors" method="Error" n=2000000 507.31 % *** 6.416333e-18
util/inspect.js option="colors" method="Object_deep_ln" n=2000000 257.20 % *** 8.804036e-23
util/inspect.js option="colors" method="Object_empty" n=2000000 704.27 % *** 8.422940e-46
util/inspect.js option="colors" method="Object" n=2000000 372.04 % *** 3.430467e-19
util/inspect.js option="colors" method="Set" n=2000000 443.65 % *** 7.503642e-30
util/inspect.js option="colors" method="String_boxed" n=2000000 458.19 % *** 4.199961e-23
util/inspect.js option="colors" method="String_complex" n=2000000 875.46 % *** 4.377511e-42
util/inspect.js option="colors" method="String" n=5000000 2209.03 % *** 3.336942e-23
util/inspect.js option="colors" method="TypedArray_extra" n=2000000 269.77 % *** 6.353860e-22
util/inspect.js option="colors" method="TypedArray" n=2000000 244.82 % *** 1.157433e-47
util/inspect.js option="none" method="Array" n=2000000 298.39 % *** 6.163207e-35
util/inspect.js option="none" method="Date" n=2000000 308.41 % *** 3.828139e-26
util/inspect.js option="none" method="Error" n=2000000 499.46 % *** 2.519987e-17
util/inspect.js option="none" method="Object_deep_ln" n=2000000 470.60 % *** 7.069515e-27
util/inspect.js option="none" method="Object_empty" n=2000000 703.54 % *** 5.821877e-41
util/inspect.js option="none" method="Object" n=2000000 678.48 % *** 1.752143e-21
util/inspect.js option="none" method="Set" n=2000000 739.62 % *** 5.402939e-18
util/inspect.js option="none" method="String_boxed" n=2000000 483.94 % *** 2.756513e-37
util/inspect.js option="none" method="String_complex" n=2000000 1082.41 % *** 3.900304e-64
util/inspect.js option="none" method="String" n=5000000 3954.65 % *** 1.558337e-26
util/inspect.js option="none" method="TypedArray_extra" n=2000000 410.59 % *** 1.364578e-19
util/inspect.js option="none" method="TypedArray" n=2000000 387.47 % *** 1.789663e-23
util/inspect.js option="showHidden" method="Array" n=2000000 272.92 % *** 2.332172e-29
util/inspect.js option="showHidden" method="Date" n=2000000 307.75 % *** 4.581806e-16
util/inspect.js option="showHidden" method="Error" n=2000000 254.46 % *** 1.552997e-19
util/inspect.js option="showHidden" method="Object_deep_ln" n=2000000 422.07 % *** 4.184839e-46
util/inspect.js option="showHidden" method="Object_empty" n=2000000 665.61 % *** 2.095402e-24
util/inspect.js option="showHidden" method="Object" n=2000000 626.02 % *** 6.570478e-39
util/inspect.js option="showHidden" method="Set" n=2000000 815.83 % *** 3.634105e-32
util/inspect.js option="showHidden" method="String_boxed" n=2000000 680.82 % *** 3.104074e-27
util/inspect.js option="showHidden" method="String_complex" n=2000000 1058.45 % *** 5.543800e-49
util/inspect.js option="showHidden" method="String" n=5000000 3473.09 % *** 6.496121e-29
util/inspect.js option="showHidden" method="TypedArray_extra" n=2000000 345.93 % *** 9.418444e-36
util/inspect.js option="showHidden" method="TypedArray" n=2000000 316.96 % *** 4.742310e-35
The main optimizations are
- Removed visibleKeys
- Removed proxy cache
- Removed Object.assign
- No key concatenating anymore
- No key recalculating anymore
- Improved indentation logic
- Improved string escape logic
- Added many fast paths
- Optimized code branches a lot
- Optimized (boxed) primitive handling
- Inline code if possible
- Only check extra keys if necessary
Besides that there were lots of smaller optimizations, the code got a bit cleaned up and a few more tests got in.
Also two bug fixes came.
Checklist
-
make -j4 test
(UNIX), orvcbuild test
(Windows) passes -
tests and/or benchmarks are included -
documentation is changed or added -
commit message follows commit guidelines
Affected core subsystem(s)
util, benchmark