🚀 Welcome to MDriven Learn –  MDriven is now on Discord!  Don’t miss the latest Release Notes.
Collect very slow
(Automatically adding template at the end of the page.)
(Adding message template to the top of the page)
Line 1: Line 1:
{{message|Write the content here to display this box}}
I have occasionally been struck by extremely bad performance when it comes to the OCL Collect operator.
I have occasionally been struck by extremely bad performance when it comes to the OCL Collect operator.



Revision as of 22:13, 16 June 2024

This page was created by Hans.karlsen on 2018-09-18. Last edited by Stephanie on 2025-02-11.

Write the content here to display this box

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 need.

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 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; List of 1 detail, List of 2 details, List of 3 details...List of 6990 details etc. This is a heavy operation as 7000 thousand 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.

MDriven Chat

How would you like to chat today?

Setting up your conversation…

This may take a few moments