Do C# Generics Have a Performance Benefit?

前端 未结 12 1098
感动是毒
感动是毒 2020-12-13 04:26

I have a number of data classes representing various entities.

Which is better: writing a generic class (say, to print or output XML) using generics and interfaces,

相关标签:
12条回答
  • 2020-12-13 04:27

    If you're thinking of a generic class that calls methods on some interface to do its work, that will be slower than specific classes using known types, because calling an interface method is slower than a (non-virtual) function call.

    Of course, unless the code is the slow part of a performance-critical process, you should focus of clarity.

    0 讨论(0)
  • 2020-12-13 04:29

    Generics are faster!

    I also discovered that Tony Northrup wrote wrong things about performance of generics and non-generics in his book.

    I wrote about this on my blog: http://andriybuday.blogspot.com/2010/01/generics-performance-vs-non-generics.html

    Here is great article where author compares performance of generics and non-generics:

    nayyeri.net/use-generics-to-improve-performance

    0 讨论(0)
  • 2020-12-13 04:32

    Not only yes, but HECK YES. I didn't believe how big of a difference they could make. We did testing in VistaDB after a rewrite of a small percentage of core code that used ArrayLists and HashTables over to generics. 250% or more was the speed improvement.

    Read my blog about the testing we did on generics vs weak type collections. The results blew our mind.

    I have started rewriting lots of old code that used the weakly typed collections into strongly typed ones. One of my biggest grips with the ADO.NET interface is that they don't expose more strongly typed ways of getting data in and out. The casting time from an object and back is an absolute killer in high volume applications.

    Another side effect of strongly typing is that you often will find weakly typed reference problems in your code. We found that through implementing structs in some cases to avoid putting pressure on the GC we could further speed up our code. Combine this with strongly typing for your best speed increase.

    Sometimes you have to use weakly typed interfaces within the dot net runtime. Whenever possible though look for ways to stay strongly typed. It really does make a huge difference in performance for non trivial applications.

    0 讨论(0)
  • 2020-12-13 04:33

    if you compare a generic list (for example) to a specific list for exactly the type you use then the difference is minimal, the results from the JIT compiler are almost the same.

    if you compare a generic list to a list of objects then there is significant benefits to the generic list - no boxing/unboxing for value types and no type checks for reference types.

    also the generic collection classes in the .net library were heavily optimized and you are unlikely to do better yourself.

    0 讨论(0)
  • 2020-12-13 04:36

    See Rico Mariani's Blog at MSDN too:

    http://blogs.msdn.com/ricom/archive/2005/08/26/456879.aspx

    Q1: Which is faster?

    The Generics version is considerably faster, see below.

    The article is a little old, but gives the details.

    0 讨论(0)
  • 2020-12-13 04:38

    Not only can you do away with boxing but the generic implementations are somewhat faster than the non generic counterparts with reference types due to a change in the underlying implementation.

    The originals were designed with a particular extension model in mind. This model was never really used (and would have been a bad idea anyway) but the design decision forced a couple of methods to be virtual and thus uninlineable (based on the current and past JIT optimisations in this regard).

    This decision was rectified in the newer classes but cannot be altered in the older ones without it being a potential binary breaking change.

    In addition iteration via foreach on an List<> (rather than IList<>) is faster due to the ArrayList's Enumerator requiring a heap allocation. Admittedly this did lead to an obscure bug

    0 讨论(0)
提交回复
热议问题