Click here to Skip to main content
Licence 
First Posted 5 Jan 2003
Views 94,356
Bookmarked 26 times

Benchmarking Direct, Delegate and Reflection Method Invocations

By | 5 Jan 2003 | Article
This console mode applet illustrates the significant performance hit of methods invoked using reflection.

Introduction

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
Type Direct Delegate Reflection
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()
{
    ++count;
}

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
 ("CallBenchmark.exe/CallBenchmark.CallBenchmark/StaticInvokeWithoutParams");
MethodInfo spMI=GetMethodInfo
 ("CallBenchmark.exe/CallBenchmark.CallBenchmark/StaticInvokeWithParams");
MethodInfo inpMI=GetMethodInfo
 ("CallBenchmark.exe/CallBenchmark.CallBenchmark/InstanceInvokeWithoutParams");
MethodInfo ipMI=GetMethodInfo
 ("CallBenchmark.exe/CallBenchmark.CallBenchmark/InstanceInvokeWithParams");

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.AutoReset=false;
timer.Stop();
timer.Elapsed+=new ElapsedEventHandler(OnTimerEvent);

...

static void OnTimerEvent(object src, ElapsedEventArgs e)
{
    done=true;
}

And each test looks something like this:

++n;
count=0;
done=false;
timer.Start();
while (!done)
{
    StaticDirectCallWithParams(1, 2, 3);
}
benchmarks[n]+=count;

Rocket science, isn't it?

Conclusion

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.

License

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

Member

Marc is the creator of two open source projets, MyXaml, a declarative (XML) instantiation engine and the Advanced Unit Testing framework, and Interacx, a commercial n-tier RAD application suite.  Visit his website, www.marcclifton.com, where you will find many of his articles and his blog.
 
Marc lives in Philmont, NY with his son Ian.

Sign Up to vote   Poor Excellent
Add a reason or comment to your vote: x
Votes of 3 or less require a comment

Comments and Discussions

 
You must Sign In to use this message board. (secure sign-in)
 
Search this forum  
 FAQ
    Noise  Layout  Per page   
  Refresh
GeneralThe difference with method body is different (45 % - 50%) Pinmemberasherab10:42 15 May '06  
Generalpoor performance of delegates Pinmemberhnipak23:47 5 Aug '03  
GeneralOne question Pinmembermcarbenay10:55 14 Jan '03  
GeneralRe: One question PinmemberMarc Clifton12:14 14 Jan '03  
GeneralMy thoughts again Pinmemberleppie7:20 7 Jan '03  
GeneralRe: My thoughts again PinmemberMarc Clifton11:16 7 Jan '03  
GeneralRe: My thoughts again Pinmemberleppie11:54 7 Jan '03  
GeneralRe: My thoughts again PinmemberJonathan de Halleux4:06 22 Sep '03  
GeneralComment PinmemberJörgen Sigvardsson6:40 7 Jan '03  
GeneralRe: Comment PinmemberMarc Clifton11:14 7 Jan '03  
GeneralRe: Comment PinmemberJörgen Sigvardsson12:02 7 Jan '03  
GeneralRe: Comment PinmemberMarc Clifton12:04 7 Jan '03  
GeneralWith optimized code... PinmemberWesner Moise19:16 6 Jan '03  
GeneralRe: With optimized code... PinmemberMarc Clifton12:10 7 Jan '03  
GeneralRe: With optimized code... PinmemberDavid Stone19:11 7 Jan '03  
GeneralRe: With optimized code... PinmemberMarc Clifton0:34 8 Jan '03  
GeneralRe: With optimized code... PinmemberDavid Stone8:16 8 Jan '03  
GeneralRe: With optimized code... PinmemberMarc Clifton10:03 8 Jan '03  
GeneralRe: With optimized code... PinmemberDavid Stone13:50 8 Jan '03  
GeneralRe: With optimized code... PinmemberSwythan0:50 15 Jan '03  
GeneralRe: With optimized code... PinmemberMarc Clifton1:06 15 Jan '03  
GeneralEval Option PinmemberWesner Moise19:06 6 Jan '03  
GeneralRe: Eval Option PinmemberJörgen Sigvardsson6:35 7 Jan '03  
GeneralSome thoughts... PinmemberMatt Gullett17:24 6 Jan '03  
GeneralRe: Some thoughts... PinmemberMarc Clifton1:18 7 Jan '03  

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    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 | Mobile
Web03 | 2.5.120517.1 | Last Updated 6 Jan 2003
Article Copyright 2003 by Marc Clifton
Everything else Copyright © CodeProject, 1999-2012
Terms of Use
Layout: fixed | fluid