I was recently brought into a report design review to see what we could do about performance of the report page load. The model was optimized and the DAX was running very quickly, but they were seeing 25+ second page load times.
At a glance the page appeared to have quite a few visuals, including a bunch of cards. Using the Performance Analyzer, we were able to determine that not only were there a ton of visual elements, there were also many design specific elements, such has shapes and backgrounds, and text boxes. It turned out there were over 160 elements on the page.
Every element on the page has a cost
If you take a look at the Performance Analyzer and expand a particular element, you will see an “Other” bucket. This Other bucket captures the time spent waiting for other objects to render. The more elements on the page, the bigger the Other bucket.
After reviewing the customer report, we came up with ideas on how to consolidate the visual elements and the report design elements to limit the number of visuals and decrease our “Other” bucket. In this case in particular, after implementation we saw a 70% performance improvement, taking render times from 25-30 seconds down to 5-8 seconds.
I mocked up a less extreme example to share the steps we took so could share the concepts here
To start, here is my “Before” view:
Step 1. Consolidate Card Visuals
A well formatted Matrix can give you the same look and feel as a bunch of individual cards, while improving performance by limiting the number of visuals on the page, as well as benefiting from DAX fusion for more optimal queries.
While the formatting will be very specific to your reporting needs, this should provide an idea of ways to implement this idea.
I have two sets of cards in this case that can be converted to Matrices, but each one has dramatically different formatting options.
Starting with the left side set of cards and text labels:
Create a new Matrix and drag the measures needed into Values in the visualization pane in the order in which you want them displayed vertically:
Now go change the Style of your matrix to “None” in the formatting pane
The most critical part to this formatting is to change your Values to “Show on Rows”
By switching this toggle on, we move the matrix from displaying horizontally to vertically.
We also want to remove the Outline on our Row Headers and Column headers so we do not have extra lines on the matrix:
Next you will want to resize your Row Headers and Values to feel more like Cards. For example, larger fonts for the values with your row headers acting as the labels. In this case I used 20 for the values and 10 for the Row headers.
Next we will go to the Grid section and add some padding to our rows to space this out a bit:
While formatting is not as exact, we are able to get very close:
The next set of cards to tackle is the horizontal one up top:
Formatting of this one is pretty straight forward. Drag your metrics into values:
Now change style to None and remove all Outlines like we did on the previous matrix
In this case, rather than worrying about padding we need to set our column width manually by clicking and dragging to gain the separation we want.
It is also important to turn off Auto-size column width, and size your columns with enough room to handle your range of values. You don’t want to end up with numbers that run off. You will also want to Center your column header alignment:
Similar to the previous matrix, increasing the size of the values will give it that card look and feel.
Our last step for this matrix is to use the “Field Formatting” to Center our alignment for each metric:
Now that our Cards are consolidated, we can move on to the design elements
Step 2. Move everything you can to the background
At a glance is is hard to notice, but this report page has 7 elements that are strictly for design.
By using the methods from my post on Backgrounds, we are able to convert those 7 elements into a single background.
Once we bring in the background with our new matrices, we have moved from 25 elements on the page down to 5 without sacrificing any content
And the results in the Performance Analyzer are staggering:
There is no decisive answer to the question of “How many elements is too many?” Each report build is different and each set of users have different expectations for performance. It is important to weigh performance and insights and find a good balance. Taking advantage of the techniques in this post will pack more insights into your reporting without sacrificing performance.