When there is a large number of include paths in the ChangeSetFilterImpl and combine that with a large-ish ChangeSet (many paths) then the comparison becomes expensive, as there is a loop with each ChangeSet-path, then looping through each include path. Basically an O(n*m).
A probably ideal solution would be to implement a tree with the tree items be the path elements. And have two sets of trees: the filter one and the ChangeSet one.
A simpler and perhaps 'good enough' solution could be to just look at the first level name of both the filter include paths: if a ChangeSet path's first level name is not in that set, then it can't be included. That would allow to skip the pattern comparison (which is slower even though it is a compiled Pattern).