(let [foo {:x 1}]
(= foo foo))
is fast, because they are identical, and = is fast for things that are identical.
In general, two maps that are = are often not identical.
There is a check whether the maps are the same size, and if not, return false without checking all key/value pairs.
If they have equal number of key/value pairs, then it will iterate through all key/value pairs of one, checking whether the key of one is present in the other, and if so, whether their associated values are equiv() or not.
Those checks can be fast if the keys are quickly comparable, and the values are quickly comparable.
If you take one persistent map m1 and remove a few keys and/or add a few keys to produce m2, then all of the unchanged keys and values they have in common will be identical, and very quickly comparable. The slowest part of comparing them would be comparing their non-identical parts.
Andy