Welcome! Please see the About page for a little more info on how this works.

0 votes
in Clojure by

{{clojure.data/diff}}, on line 118, defines:

java.util.Map (diff-similar [a b] (diff-associative a b (set/union (keys a) (keys b))))

Since {{keys}} returns a key seq, this seems like an error. {{clojure.set/union}} has strange and inconsistent behavior with regard to non-sets, and in this case the two key seqs are concatenated. Based on a cursory benchmark, it seems that this bug (?) is a slight performance gain when the maps have no common keys, and a significant performance loss when the maps have the same keys. The results are still correct because of the merging reduce in {{diff-associative}}.

The patch is easy (just call set on each key seq).

3 Answers

0 votes
by

Comment made by: jafingerhut

clj-1087-diff-perf-enhance-patch-v1.txt dated Oct 15 2012 implements Tom's suggested performance enhancement, although not exactly in the way he suggested. It does calculate the union of the two key sequences.

0 votes
by

Comment made by: jafingerhut

I would suggest that perhaps bigger than the issue of performance here is that Clojure is relying on its own undocumented behavior that clojure.set/union works on some non-set arguments.

0 votes
by
Reference: https://clojure.atlassian.net/browse/CLJ-1087 (reported by tomoj)
...