String的几种比较方法耗时对比
本文测试的字符串比较方法有:
string.Compare :
文档定义:比较两个字符串并返回其相对排序顺序的指示。
Compare会通过传递进来的文化信息来调用对应的比较。
文化信息CultureInfo类文档定义(有兴趣可以了解): 提供有关特定区域性的信息(对于非托管代码开发,则称为 “区域设置” )。 这些信息包括区域性的名称、书写系统、使用的日历、字符串的排序顺序以及对日期和数字的格式化设置。
string.CompareOrdinal :
文档定义:通过计算每个字符串中相应 String 对象的数值来比较两个 Char 对象。
CompareOrdinal是将整个字符串每5个字符(10个字节)分成一组,然后逐个比较,找到第一个不相同的ASCII码后退出循环。
string.CompareTo :
文档定义: 将此实例与指定的 String 对象进行比较,并指示此实例在排序顺序中是位于指定的字符串之前、之后还是与其出现在同一位置。
String的compareTo其实就是依次比较两个字符串ASC码。如果两个字符的ASC码相等则继续后续比较,否则直接返回两个ASC的差值。
string.Equals :
文档定义: 确定两个String对象是否具有相同的值。
a.Equals :
文档定义:确定此实例是否与另一个指定的String对象具有相同的值。(上一个是静态方法,这是实例方法)
a.StartsWith("b") :
文档定义:确定此字符串实例的开头是否与指定的字符串匹配。
a.StartsWith("b",System.StringCompare.Ordinal) :
文档定义:确定在使用指定的比较选项进行比较时此字符串实例的开头是否与指定的字符串匹配。
Ordinal : 使用序号(二进制)排序规则比较字符串。
StringComparer 返回 Ordinal 属性执行与语言无关的简单字节比较。 比较字符串生成的以编程方式或比较区分大小写的资源,如密码时,这是最合适。
a.EndsWith("b")
a.EndsWith("b",System.StringCompare.Ordinal)
附StringComparison枚举( 指定供 String.Compare 和 String.Equals 方法的特定重载使用的区域性、大小写和排序规则。 ):
测试:
测试环境:PC端 VS2013
循环次数: const int Num = 10000000;
比较的字符串: string str1 = "abcdefg"; string str2 = "abcwqer"; string str3 = "abcdefg"
比较方法: for (int i = 0; i < Num;i++ ) {string.Compare(str1, str2); }(循环里为以上比较的方法)
结果:
不同字符串:
相同字符串:
总结:
(1)当我们比较字符串大小时,尽量使用CompareOrdinal方法。
(2)Compare会通过传递进来的文化信息调用对应的比较,所以进行国际化的时候,字符串比较必须使用String.Compare静态方法。因为Compare是静态的,建议尽可能的使用String.Compare代替CompareTo方法。
(3)尽量使用a.StartsWith("b", System.StringComparison.Ordinal)和a.EndsWith("b",System.StringCompare.Ordinal)方法,提高效率。
(4)比较两个字符串是否相等时,我们用:
str1.Equals(str2,StringComparison.Ordinal);