I have read that when in your application you do a lot of string comparison and using ToLower method, this method is quite costly. I was wondering of anyone could explain to me how is it costly. Would appreciate any info or explanation. Thanks!
相关问题
- Generic Generics in Managed C++
- how to split a list into a given number of sub-lis
- How to Debug/Register a Permanent WMI Event Which
- 'System.Threading.ThreadAbortException' in
- Faster loop: foreach vs some (performance of jsper
See also writing culture-safe managed code for a very good reason why not to use
ToLower()
.In particular, see the section on the Turkish "I" - it's caused no end of problems in the past where I work...
Calling
"I".ToLower()
won't return"i"
if the current culture is Turkish or Azerbaijani. Doing a direct comparison on that will cause problems.There is another advantage to using the String.Compare(String, String, StringComparison) method, besides those mentioned in the other answers:
You can pass
null
values and still get a relative comparison value. That makes it a whole lot easier to write your string comparisons.From the documentation:
Each time you call ToLower(), a new copy of the string will be created (as opposed to making the case changes in-place). This can be costly if you have many strings or long strings.
From String.ToLower docs:
As somebody already answered, ToLower() will create a new string object, which is extra cost comparing to using "IgonoreCase". If this ToLower is triggered frequently, you end up creating a lot of small objects in your heap, and will add Garbage Collection time, which becomes a performance penalty.
It's costly because a new string is "manufactured".
Compare that to calling, say, Equals with an overload that asks for a case-insensitive comparison. This allows the comparison to terminate, without having to create a new string, as soon as a mismatch is identified.