assert: improve deepEqual Set and Map worst case
This change improves the algorithm for the worst case from O(n^2) to O(n log n) by using a lazily initiated set for object keys and a special handling for loose equal primitives.
In addition a few comments got fixed and a few statements simplified.
There is still 100% coverage and I heavily tested weird cases.
Benchmarks:
assert/deepequal-set.js method="deepEqual_looseMatches" len=500 n=500 6810.50 % *** 4.878337e-16
assert/deepequal-set.js method="deepEqual_mixed" len=500 n=500 1004.55 % *** 6.872133e-24
assert/deepequal-set.js method="deepEqual_objectOnly" len=500 n=500 1077.10 % *** 7.799749e-21
assert/deepequal-set.js method="deepEqual_primitiveOnly" len=500 n=500 62.80 % *** 8.981486e-11
assert/deepequal-set.js method="deepStrictEqual_mixed" len=500 n=500 994.50 % *** 1.788847e-15
assert/deepequal-set.js method="deepStrictEqual_objectOnly" len=500 n=500 1089.84 % *** 7.120327e-17
assert/deepequal-set.js method="deepStrictEqual_primitiveOnly" len=500 n=500 3.58 % 2.607197e-01
assert/deepequal-set.js method="notDeepEqual_looseMatches" len=500 n=500 6795.11 % *** 4.752399e-13
assert/deepequal-set.js method="notDeepEqual_mixed" len=500 n=500 777.34 % *** 2.503238e-27
assert/deepequal-set.js method="notDeepEqual_objectOnly" len=500 n=500 409.91 % *** 3.435125e-17
assert/deepequal-set.js method="notDeepEqual_primitiveOnly" len=500 n=500 183.85 % *** 8.764397e-29
assert/deepequal-set.js method="notDeepStrictEqual_mixed" len=500 n=500 4.43 % * 2.496594e-02
assert/deepequal-set.js method="notDeepStrictEqual_objectOnly" len=500 n=500 437.70 % *** 1.406055e-27
assert/deepequal-set.js method="notDeepStrictEqual_primitiveOnly" len=500 n=500 3.13 % 3.144997e-01
assert/deepequal-map.js method="deepEqual_looseMatches" len=500 n=500 1814.34 % *** 1.700744e-20
assert/deepequal-map.js method="deepEqual_mixed" len=500 n=500 952.35 % *** 1.807387e-17
assert/deepequal-map.js method="deepEqual_objectOnly" len=500 n=500 1042.38 % *** 1.482305e-16
assert/deepequal-map.js method="deepEqual_primitiveOnly" len=500 n=500 133.51 % *** 1.363842e-16
assert/deepequal-map.js method="deepStrictEqual_mixed" len=500 n=500 996.73 % *** 3.463207e-19
assert/deepequal-map.js method="deepStrictEqual_objectOnly" len=500 n=500 1072.64 % *** 2.516677e-17
assert/deepequal-map.js method="deepStrictEqual_primitiveOnly" len=500 n=500 81.57 % *** 2.526982e-18
assert/deepequal-map.js method="notDeepEqual_looseMatches" len=500 n=500 1787.48 % *** 4.458942e-20
assert/deepequal-map.js method="notDeepEqual_mixed" len=500 n=500 598.92 % *** 1.020276e-14
assert/deepequal-map.js method="notDeepEqual_objectOnly" len=500 n=500 407.62 % *** 7.984672e-23
assert/deepequal-map.js method="notDeepEqual_primitiveOnly" len=500 n=500 179.22 % *** 8.525884e-17
assert/deepequal-map.js method="notDeepStrictEqual_mixed" len=500 n=500 -1.87 % 7.260855e-01
assert/deepequal-map.js method="notDeepStrictEqual_objectOnly" len=500 n=500 429.53 % *** 3.240289e-20
assert/deepequal-map.js method="notDeepStrictEqual_primitiveOnly" len=500 n=500 63.90 % *** 1.195866e-14
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)
assert