PowerApps Performances’ Optimisation – Parallel Processing
In the two previous posts, I covered the different data sources, and the impact of having a heaving OnStart event.
Today, we will look at how we can improve PowerApps Performances by taking advantage of the parallel processing functionalities available in PowerApps.
Parallel or Concurrent Data Load/Read
When it comes to initializing your collections of data, in most cases you would be tempted to do something like:
ClearCollect(FirstCollection, Filter(BackEndDataSource, Column1="Project 1")); ClearCollect(NewProducts, Filter(ProductsTables, ManufacturingYear=2022)); ClearCollect(ThirdCollection, Filter(BackEndDataSource2, ColumnFilter="Project 1")); ... ... ... ClearCollect(NthCollection, FirstN(BackEndDataSource, 100));
The issue ?
No particular issue, except that these calls will run in a sequence (sequential order), which means that the next call won’t be made until the first one completes.
This might be a problem if we are loading large data sets, and the impact of performances can be huge.
What to do instead ?
Easy, we should wrap these calls in the concurrent function, which allows us to make these calls in parallel.
Still the overall Concurrent function won’t finish until all the sub-calls have been completed. But this minor tweak will improve considerably the overall performances of your application.
Concurrent( ClearCollect(FirstCollection, Filter(BackEndDataSource, Column1="Project 1")), ClearCollect(NewProducts, Filter(ProductsTables, ManufacturingYear=2022)), ClearCollect(ThirdCollection, Filter(BackEndDataSource2, ColumnFilter="Project 1")) ..., ..., ..., ClearCollect(NthCollection, FirstN(BackEndDataSource, 100)) )
Parallel data writing / Patch
Following the same logic, when it comes to writing data to the back end (regardless of which back end you are using), the default behaviour would be to perform a series of Patches in sequence.
Here, the same problem as previously, the next write (Patch), won’t start until PowerApps Performances the previous one finishes.
ForAll( ProductsToBeUpdatedColl, Patch( Products, LookUp(Product, ID=ProductsToBeUpdatedColl[@ID]), { Name: ProductsToBeUpdatedColl[@Name], Description: ProductsToBeUpdatedColl[@Description], PPUnit: ProductsToBeUpdatedColl[@PPUnit] } ) );
What to do instead ?
Instead of looping for each item of a collection, we should make one Patch call and pass the collection to be updated as follow:
Patch( Products, ShowColumns( ProductsToBeUpdatedColl, "Name", "Description", "PPunit" ) );