While writing code we generally don’t pay much attention to boxing & unboxing. It does matter in 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
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