zoukankan      html  css  js  c++  java
  • 两种不同字符串比较方法的性能对比

    在日常的编程过程总,由于编程需要,我们经常会比较两个字符串是否相等,然后再做相应的处理。代码书写起来是觉得很爽,不是吗?if (a==b) then ……else……但是有没有更快的方式呢?当我们调用 a==b的时候,通过IL代码可以看到内部实际上调用了String.Equals(string,string)这个方法

    IL_0021: call bool [mscorlib]System.String::op_Equality(string,
     string)
    IL_0026: stloc.s re
    public static bool Equals(string a, string b)
    {
        if (a == b)
        {
            return true;
        }
        if ((a != null) && (b != null))
        {
            return EqualsHelper(a, b);
        }
        return false;
    }

    更为严重的是更底层调用的是EqualsHelper辅助方法,它首先比较两个字符串的长度,然后逐个字符的通过引用指针的方式进行比较,由于无法明确的区隔是否和语言别有关系,内部处理异常复杂。有没有更快速的方法呢?
    答案是有的。
    .Net 2.0中新增了一个StringComparison枚举类型,实际上我们大多数的字符串比较是和语言别无关的,我们应该使用Ordinal和OrdinalIgnoreCase两个枚举值。处于性能考虑,在字符串比较时不应该直接使用==操作符,而应该使用
    bool Equals(string value, StringComparison comparisonType)
    bool Equals(string a, string b, StringComparison comparisonType)
    为此,我进行了一个测试,看看不等的==操作符和String.Equals方法之间的性能差别有多大。
    测试代码:

    string a = "abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+";
    string b = "abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+?";
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int i = 0; i< 90000000; i++) {
        bool re = a.Equals(b, StringComparison.OrdinalIgnoreCase);
    }
    watch.Stop();
    double time = watch.Elapsed.TotalSeconds;
    Console.Write(time);
    Console.ReadLine();

    测试了三次,分别为:1.1163117,1.106148,1.1041815
    然后运行下面的代码:

    string a = "abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+";
    string b = "abcdefghigklmnopqrstuvwxyz0123456789!@#$%^&*()_+?";
    Stopwatch watch = new Stopwatch();
    watch.Start();
    for (int i = 0; i< 90000000; i++) {
        bool re = (a == b);
    }
    watch.Stop();
    double time = watch.Elapsed.TotalSeconds;
    Console.Write(time);
    Console.ReadLine();

    测试了三次,分别为:1.6392576,1.6143791,1.6253847
    算出平均值之后,两者在速度上相差46.675%。差别惊人阿!

  • 相关阅读:
    大整数乘法
    Independent Components Analysis:独立成分分析
    因子分析(Factor analysis)
    EM算法原理详解
    简易解说拉格朗日对偶(Lagrange duality)
    机器学习中有关概率论知识的小结
    高斯混合和EM算法
    java
    java
    java
  • 原文地址:https://www.cnblogs.com/masahiro/p/10131772.html
Copyright © 2011-2022 走看看