Interfaces and Virtuals Everywhere

Method Invocation based on Runtime Type of Parameter (conclusion)
February 22, 2017
C# Power Programming #106 – More on Object Graphs
February 22, 2017

Interfaces and Virtuals Everywhere

Interfaces and Virtuals Everywhere????

First a disclaimer; this post is about micro-optimization of C# programs and does not apply to most common scenarios – but when it does, it is important to know.


Many developers are in the habit of declaring member virtual to allow for future expansion or using interface based designs1. Few of these developers think about what the runtime performance impact of this decision is.

A simple test will show that this decision can have a serious impact. For our purposes, we used a simple loop to time the execution of 1 billion calls to both non-virtual and virtual implementations of a method that took no parameters and had a void return type:

Direct Call: 1.5uS
Virtual Call: 13.0uS

The overhead of the call increased by nearly an order of magnitude!

Once again, it is important to realize that if the method does anything of significance then this ratio drops quite quickly. If the method does just 1mS of work, then the differential only accounts for a 1% decrease in performance. Additionally the method in question must be called thousands of times in order to produce a meaqsurable impact at the application level.

Yet let us consider a situation such as the per-pixel processing of a graphics processing application. Here we may have a method which is called millions of times and even the slightest increase in overhead can have significant ramification. In this case using either explicit virtuals or interface based constructs is likely to be a mistake.

In conclusion, good design principles should always be the driving force behind descisions such as these; but remember that these decisions do not come for free.

Important Note: When a concrete class member implements an interface it does not need to be explicitly marked as virtual (unless, of course, it is to be overriden in a derived concerete class). Nevertheless, when accessed via the interface it behaves exactly as if it had been marked as virtual.

Leave a Reply

Your email address will not be published. Required fields are marked *