Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

While developer developing software, it is very important to keep an eye on the performance. Catel itself does perform very well, but there are some caveats that you should be aware of. If you have the feeling that the the application is laggy or slow, or if you want to make sure to squeeze the best performance out of Catel, consider taking a closer look at the checklist below is very important.

Tip

Use the ApiCop feature to get a detailed advisory report on your software

...

Therefore, it is important to disable any call to LogManager.AddDebugListener when releasing an application or while performance testing.

Disable event subscriptions of child values for ModelBase

To be able to (re)validate when a child object changes, the ModelBase subscribes to all change notifications (of all childs) by default. This can be disabled by using the following code:

Code Block
ModelBase.DefaultDisableEventSubscriptionsOfChildValuesValue = false;

Disabling validation during activities where validation is not required

...

When modifying a large collection of items, it is not required to raise change events for each added / removed value. Therefore the FastObservableCollection will disable change notifications until the full collection modification is done and then raise the change events just once.

Implementing IViewPropertySelector

Catel uses a special wrapping technology to wrap bindings to dependency properties to be able to add change notifications for all target platforms. Though this technology works great, it might have impact on performance and this is not always necessary. By implementing a custom IViewPropertySelector, developers can tweak the interesting dependency properties per type.

Note

By default Catel subscribes to all dependency properties to not cause breaking changes. It is however possible to override the registration using the FastViewPropertySelector that ships with Catel

It is best to always create a default dependency instead.

Code Block
public class CustomViewPropertySelector : ViewPropertySelector
{
    public override bool MustSubscribeToAllViewProperties(Type targetControlType)
	{
		return false;
	}
}

Then register it in the ServiceLocator:

Code Block
ServiceLocator.Default.RegisterType<IViewPropertySelector, CustomViewPropertySelector>();

Even when the custom IViewPropertySelector implementation returns an empty list, Catel will always subscribe to the DataContext dependency property because it depends on that.

Specify throttling on the ViewModelBase

...