I have occasionally been struck by extremely bad performance when it comes to the OCL Collect operator.
After debugging, I concluded that the expression used was wrong compared to my intended usage and needs.
Consider this expression:
Sequence{0..7000}->collect(a| vCollectionDetails.add(Detail.Create))
My intention is to create 7000 Detail objects and put them in the variable vCollectionDetails that has the type Collection(Detail).
But this expression is extremely slow.
The main reason for the slowness is that Collect actually builds a result of all the results of the inner expression. In our case, this is a List of Lists: a List of 1 detail, a List of 2 details, a List of 3 details... List of 6990 details, etc. This is a heavy operation, as 7000 lists must be created and filled with 7000*7000/2 objects—I am not interested in that result. I only used the Collect operator as a convenient way to act on each.
Look at foreach for a solution or to avoid returning the list. Instead, return something simple like this:
Sequence{0..7000}->collect(a| vCollectionDetails.add(Detail.Create);0)
In this case, the collect operator returns 1 list with 7000 zeros—much faster than 24 million references to 7000 Detail objects.
