posts - 218, comments - 222, trackbacks - 68

My Links

News




I am a Microsoft Certified Application Developer MCAD Chartered Member (C# .Net) and born in Bangladesh.
I work for Ocean Informatics Pty Ltd as a Senior Developer - Analyst.
I am also co-founder and core developer of Pageflakes (acquired by LiveUniverse) www.pageflakes.com
and most recently created SmartCodeGenerator

My Articles
Flexible and Plugin based .Net Application..
Mass Emailing Functionality with C#, .NET 2.0, and Microsoft® SQL Server 2005 Service Broker'
Write your own Code Generator or Template Engine in .NET
Smart Code Generator .NET: Usage Overview
Smart Code Generator .NET: Architectural Overview
Smart Code Generator .NET: using with NAnt and Cassini

Archives

Free Programming Language Training

Improving Reflection Performance

Some tips to keep in mind when using reflection....
Source MSDN: http://msdn.microsoft.com/msdnmag/issues/05/07/Reflection/default.aspx?loc=&side=true#a

Improving Reflection Performance

There are various reasons why an application can't define a static extensibility contract, but it's usually a result of the flexibility the architect built in. Here are some ways to reduce some of the cost of reflection and of the MemberInfo cache.

Avoid using Type.InvokeMember to call late-bound methods  Type.InvokeMember is the slowest way to invoke a member via reflection. If your scenario doesn't involve COM interop invocation (something which Type.InvokeMember makes easier), consider other alternatives for setting up calls to members obtained through late-bound methods.

Avoid case-insensitive member lookups  When calling both the plural and non-plural GetXX APIs, avoid specifying BindingFlags.IgnoreCase as a binding flag argument as it has a significant invocation and working set costs. Metadata is case sensitive and to perform an "ignore case" operation, reflection needs to obtain the metadata string names for all members of a type and then do a case-insensitive comparison. In addition, due to the design of the reflection cache, a second MemberInfo cache is created for the case-insensitive members, which basically doubles an application's working set.

Use BindingFlags.ExactMatch whenever possible  Specify this BindingFlag when calling MethodBase.Invoke if you know that the types of the arguments you are passing exactly match the types of the method's parameters. It will allow reflection to go down an optimized, more efficient code path that does not perform argument type-coercion. If the argument types don't match the method's parameter types, an exception will be thrown.

Call the non-plural GetXX method if you know the name of the instance you care about (.NET Framework 2.0 only)  The MemberInfo cache is lazily populated in the .NET Framework 2.0, which means lower working set cost, and less time to retrieve the method. If you know the name of the particular method you want to obtain, use the non-plural GetXX method.

Cache only the handle to a member (.NET Framework 2.0 only)  In the .NET Framework 2.0, developers have the ability to define a cache policy themselves. The .NET Framework 2.0 introduces new APIs called the token handle resolution APIs. This set of APIs exposes some of the fundamental member identity concepts of the runtime and allows a user to set up and execute a MemberInfo caching policy on their own.


Print | posted on Monday, January 22, 2007 11:31 PM |

Feedback

Gravatar

# re: Improving Reflection Performance

I read a lot about reflection and all articles says that reflection more slower than direct calls.( Minimum 4 times )

İ am developing a win32 GUI ( C# ) and at main form there is linklabels .When you click linklabels usercontrols loading into i panel .All pages ( user operations ) are usercontrol so when user want to open another page i am removing the current usercontrol and adding desired usercontrol in to a panel.

If i want to extend GUI i have to build Mainform everytime .But i thought if i use reflection and convert every usercontrol to dll .I can call them via latebinding iso with late bindind i can store page information in dll and i dont have to build Mainform everytime just build one usercontrol project ,make dll and update Mainform automatically.

But i read a lot of artcile and all says reflection is very slow .Tomy usercontrol just call Ctor() after that Call LoadPage() and Cast object as a usercontrol and add it to a panel
And my question is after dll (usercontrol) adding if user hit the button in usercontrol is that function for example Button1_Click() will be more slower than direct call (old one).
Sorry about my pure English but At the end of artcile MSDN said you can reach him via your email :)

---This Code is not working just summarize---

// when LİNKLABEL clicked at Mainform

Type[] types = operationList[i].OperationAssembly.GetTypes();
foreach (Type typ in types)
{
ConstructorInfo[] infos = typ.GetConstructors();
objUserControl = infos[0].Invoke(
null);
object result = typ.InvokeMember("LoadPage",BindingFlags.Default | BindingFlags.InvokeMethod,null,objUserControl,null);
UserControl us = (objUserControl as UserControl);
//Remving old Usercontrol from panel and adding us into a panel as a control
ReplacePage(us);
us.Show();
..
..
//I know this Invoke Member is slow and has performance improvement tricks like caching

// I can Cache LoadPage Method with CacheKey Class
class CacheKey
{
public CacheKey(RuntimeTypeHandle th, string methodName, Type[] args)
{
InstanceHandle = th;
MethodName = methodName;
TypeArguments = args;
}
...
}

LETS ASSUME IN USERCONTROL i have private method Button1_Click()

How can i cache private Methods in Usercontrol For example how can i cache Button1_Click in UserControl ???????
//SO only LoadPage () will be fast !! IS it Correct
7/13/2008 2:00 AM | Serhat Şahin

Post Comment

Title  
Name  
Email
Url
Comment   
Please add 8 and 3 and type the answer here:

Powered by: