F# Set.union argument order performance
Is there any recommended way to call a Set.union if I know one of the two sets will be larger than the other?
Set.union large small
or
Set.union small large
Th开发者_如何转开发anks
Internally, sets are represented as ballanced tree (you can check the source online). When calculating the union of sets, the algorithm splits the smaller set (tree) based on the value from the root of the larger set (tree) into a set of smaller and a set of larger elements. The splitting is always performed on the smaller set to do less work. Then it recursively unions the two left and right subsets and performs some re-ballancing.
The summary is, the algorithm does not really depend on which of the sets is the first and which of them is the second argument. It will always choose the better option depending on the size of set (which is stored as part of the data structure).
The intent behind your question seems to improve performance when using Set.union
by exploiting undocumented features of this function implementation. But Set.union
abstracts you from implementation complexity leaving just set-theoretic meaning of union operation that is agnostic to the argument properties. Purposedly breaking through this abstraction layer adversely affects complexity and maintainability of your code and should be avoided.
Although sometimes you have no choice but deal with leaky abstractions, Set.union
is definitely not the case. And it is good to hear from Tomas that Set.union
implementation does not have leaky abstraction flaws.
Do whatever you want. You can also do small + large
, and large - small
for difference (of course also small - large
).
精彩评论