While writing code we generally don’t pay much attention to boxing & unboxing. It does matter in performance. And a highly skilled and experienced C# / .NET developer must pay attention to everything that can improve performance.
In relation to simple assignments, boxing and unboxing are computationally expensive processes. When a value type is boxed, a new object must be allocated and constructed. To a lesser degree, the cast required for unboxing is also expensive computationally.
- Boxed value type objects take up more memory
- Boxed value type objects require an additional read
- Short-lived value type objects eat up Gen 0 heap & this forces frequent garbage collections
- Boxing and unboxing operations consume CPU & time
- Casting is required & it can be costly
How to prevent boxing & unboxing:
- Use ToString method of numeric data types such as int, double, float etc.
- Use for loop to enumerate on value type arrays or lists (do not use foreach loop or LINQ queries)
- Use for loop to enumerate on characters of string (do not use foreach loop or LINQ queries)
- If you define your own value type then override implementation of basic object methods.
- Don’t assign value type instance to object unless unavoidable
- Use generic List<>, Dictionary<> (et al) instead of ArrList & HashTable.
- Use Nullable<> value types (examples int?, float? etc)
- When using string.Format (SrtingBuilder.AppendFormat) or similar API’s that use ‘params object’ pass on value type objects by calling ‘ToString()’ method
Avoid Boxing and Unboxing to improve performance
Pay attention for below mentioned things & do some code refactoring
- Implicit boxing (Example: object num = 1; )
- Use of foreach on value types
- LINQ queries on value type collections
- Casting to value types
Here is my another post about Effectively use StringBuilder to improve performance while concatenating strings which is related to similar performance topic.