All of us know the power of late binding or dynamic binding.
Using this feature of .NET we can load any assembly at runtime and create an instance of a type in that assembly at runtime.
Some of the commonly used APIs used for this task are :
Assembly.Load
Type.InvokeMember
Today i decided to see the performance impact of dynamic binding and the results which i got are really scary.
Here are the test details :
Created an class library with following code:
namespace VikasGoyal
{
public class MathLibrary
{
public double increment(double value)
{
return value + 1;
}
}
}
A simple class with a method which increments the input value by 1 and returns the incremented value.
Created a console application which creates instance of MathLibrary and calls increment method in a for loop. The loop count is 9,000,000.
The console application utilizes library in three different ways :
1. Static linking
MathLibrary was added as a reference, instance created and method called.
VikasGoyal.MathLibrary ml = new VikasGoyal.MathLibrary();
value = ml.increment(value);
2. Creating type dynamically
MathLibrary was added as a reference but type instance created dynamically.
className = typeof(VikasGoyal.MathLibrary);
System.Object target = Activator.CreateInstance(className);
value = (double)className.InvokeMember("increment", System.Reflection.BindingFlags.InvokeMethod, null, target, new object[] { value });
3. Assembly Loaded dynamically
No reference of MathLibrary was added at build time to Console application.
Library was loaded at runtime and instances created at runtime
Assembly asm = Assembly.Load("MathLibrary");
className = asm.GetType("VikasGoyal.MathLibrary");
Following is time taken to complete the above mentioned loops by various methods:
1. Static Linking : 0.38 secs
2. Creating type dynamically : 47.7 secs
3. Assembly Loaded dynamically : 6 min 10 sec.
The performance difference seems to be huge. Multiple tests were done to ensure consistency of results.
Soon i will publish the results with asp.net as calling application to verify if asp.net does some optimizations for assembly loading.
Other Posts
No comments:
Post a Comment