Click here to Skip to main content
13,550,059 members
Click here to Skip to main content
Add your own
alternative version


30 bookmarked
Posted 5 Jan 2003

Benchmarking Direct, Delegate and Reflection Method Invocations

, 5 Jan 2003
Rate this:
Please Sign up or sign in to vote.
This console mode applet illustrates the significant performance hit of methods invoked using reflection.


This article was inspired by:

Both of these articles have inspired me to do some benchmarking of the three forms of function invocation offered in C#:

  • Direct call
  • via a delegate
  • via reflection

As I am in the prototyping stages of an "application automation layer" (The Application Automation Layer: Introduction And Design [^] and The Application Automation Layer - Design And Implementation of The Bootstrap Loader And The Component Manager [^]) which currently relies heavily on method invocation via reflection, I thought I should take the advice of both of these articles and look at the performance of my current implementation.

The results are rather astonishing.

Benchmarking C#

Didn't I read somewhere on CP that the Microsoft license agreement specifically says "thou shalt not benchmark .NET!"? Well, that's yet another commandment I've broken.

I decided to write a really simple benchmarking program, not for the purposes of gleaning minor differences between the three types of function invocation, but to determine if there are any large differences. The benchmark program compares:

Benchmark Matrix
Static, No parameters---
Static, With parameters---
Instance, No parameters---
Instance, With parameters---

The results are as follows:

You will notice that reflection is approximately 50 times slower than direct calls. This means that I am going to have to seriously reconsider my implementation in the AAL!

Some Code

The program benchmarks twelve different types of invocation. They all look basically like this:

public static void StaticDirectCallWithoutParams()

simply consisting of a counter increment.

At the beginning of the program, the delegates and reflection methods are initialized along with a couple of embedded constants controlling the number of times the test is run, and how many milliseconds we spend calling the function under test:

CallBenchmark cb=new CallBenchmark();

SNPCall snpCall=new SNPCall(StaticDelegateWithoutParams);
SPCall spCall=new SPCall(StaticDelegateWithParams);
INPCall inpCall=new INPCall(cb.InstanceDelegateWithoutParams);
IPCall ipCall=new IPCall(cb.InstanceDelegateWithParams);

MethodInfo snpMI=GetMethodInfo
MethodInfo spMI=GetMethodInfo
MethodInfo inpMI=GetMethodInfo
MethodInfo ipMI=GetMethodInfo

int sampleSize=20;    // # of samples
int timerInterval=200;  // in ms

A timer is set up to stop the test:

Timer timer=new Timer(timerInterval);
timer.Elapsed+=new ElapsedEventHandler(OnTimerEvent);


static void OnTimerEvent(object src, ElapsedEventArgs e)

And each test looks something like this:

while (!done)
    StaticDirectCallWithParams(1, 2, 3);

Rocket science, isn't it?


This little test clearly shows the performance hit taken by invoking methods using reflection. Even considerations like CPU caching wouldn't account for this significant variance (I think!). Obviously, I need to rethink my architecture implementation.


This article has no explicit license attached to it but may contain usage terms in the article text or the download files themselves. If in doubt please contact the author via the discussion board below.

A list of licenses authors might use can be found here


About the Author

Marc Clifton
United States United States
Marc is the creator of two open source projects, MyXaml, a declarative (XML) instantiation engine and the Advanced Unit Testing framework, and Interacx, a commercial n-tier RAD application suite.  Visit his website,, where you will find many of his articles and his blog.

Marc lives in Philmont, NY.

You may also be interested in...


Comments and Discussions

GeneralThe difference with method body is different (45 % - 50%) Pin
asherab15-May-06 10:42
memberasherab15-May-06 10:42 
Generalpoor performance of delegates Pin
hnipak5-Aug-03 23:47
memberhnipak5-Aug-03 23:47 
GeneralOne question Pin
mcarbenay14-Jan-03 10:55
membermcarbenay14-Jan-03 10:55 
GeneralRe: One question Pin
Marc Clifton14-Jan-03 12:14
memberMarc Clifton14-Jan-03 12:14 
That's a good question. I haven't explored the differences between debug and release mode versions, but from discussions I've had, it appears there are several!


Help! I'm an AI running around in someone's f*cked up universe simulator.
Sensitivity and ethnic diversity means celebrating difference, not hiding from it. - Christian Graus
Every line of code is a liability - Taka Muraoka

GeneralMy thoughts again Pin
leppie7-Jan-03 7:20
memberleppie7-Jan-03 7:20 
GeneralRe: My thoughts again Pin
Marc Clifton7-Jan-03 11:16
memberMarc Clifton7-Jan-03 11:16 
GeneralRe: My thoughts again Pin
leppie7-Jan-03 11:54
memberleppie7-Jan-03 11:54 
GeneralRe: My thoughts again Pin
Jonathan de Halleux22-Sep-03 4:06
memberJonathan de Halleux22-Sep-03 4:06 
GeneralComment Pin
Jörgen Sigvardsson7-Jan-03 6:40
memberJörgen Sigvardsson7-Jan-03 6:40 
GeneralRe: Comment Pin
Marc Clifton7-Jan-03 11:14
memberMarc Clifton7-Jan-03 11:14 
GeneralRe: Comment Pin
Jörgen Sigvardsson7-Jan-03 12:02
memberJörgen Sigvardsson7-Jan-03 12:02 
GeneralRe: Comment Pin
Marc Clifton7-Jan-03 12:04
memberMarc Clifton7-Jan-03 12:04 
GeneralWith optimized code... Pin
Wesner Moise6-Jan-03 19:16
memberWesner Moise6-Jan-03 19:16 
GeneralRe: With optimized code... Pin
Marc Clifton7-Jan-03 12:10
memberMarc Clifton7-Jan-03 12:10 
GeneralRe: With optimized code... Pin
David Stone7-Jan-03 19:11
memberDavid Stone7-Jan-03 19:11 
GeneralRe: With optimized code... Pin
Marc Clifton8-Jan-03 0:34
memberMarc Clifton8-Jan-03 0:34 
GeneralRe: With optimized code... Pin
David Stone8-Jan-03 8:16
memberDavid Stone8-Jan-03 8:16 
GeneralRe: With optimized code... Pin
Marc Clifton8-Jan-03 10:03
memberMarc Clifton8-Jan-03 10:03 
GeneralRe: With optimized code... Pin
David Stone8-Jan-03 13:50
memberDavid Stone8-Jan-03 13:50 
GeneralRe: With optimized code... Pin
Swythan15-Jan-03 0:50
memberSwythan15-Jan-03 0:50 
GeneralRe: With optimized code... Pin
Marc Clifton15-Jan-03 1:06
memberMarc Clifton15-Jan-03 1:06 
GeneralEval Option Pin
Wesner Moise6-Jan-03 19:06
memberWesner Moise6-Jan-03 19:06 
GeneralRe: Eval Option Pin
Jörgen Sigvardsson7-Jan-03 6:35
memberJörgen Sigvardsson7-Jan-03 6:35 
GeneralSome thoughts... Pin
Matt Gullett6-Jan-03 17:24
memberMatt Gullett6-Jan-03 17:24 
GeneralRe: Some thoughts... Pin
Marc Clifton7-Jan-03 1:18
memberMarc Clifton7-Jan-03 1:18 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.

Permalink | Advertise | Privacy | Terms of Use | Mobile
Web02 | 2.8.180515.1 | Last Updated 6 Jan 2003
Article Copyright 2003 by Marc Clifton
Everything else Copyright © CodeProject, 1999-2018
Layout: fixed | fluid