2

下面我比较两个字符串的代码示例中是否有任何性能优化?

第一的:

public static bool Compare_01()
{
    string str_01 = "a";
    string str_02 = "a";

    if (str_01 == str_02)
        return true;
    else
        return false;
}

二:

public static bool Compare_02()
{
    string str_01 = "a";
    string str_02 = "a";

    if ((object)str_01 == (object)str_02)
        return true;
    else
        return false;
}

两人都回来了true

他们的il代码只有一个不同:

第一个:

IL_0001:  ldstr       "a"
IL_0006:  stloc.0     // str_01
IL_0007:  ldstr       "a"
IL_000C:  stloc.1     // str_02
IL_000D:  ldloc.0     // str_01
IL_000E:  ldloc.1     // str_02
IL_000F:  call        System.String.op_Equality

第二:

IL_0001:  ldstr       "a"
IL_0006:  stloc.0     // str_01
IL_0007:  ldstr       "a"
IL_000C:  stloc.1     // str_02
IL_000D:  ldloc.0     // str_01
IL_000E:  ldloc.1     // str_02
IL_000F:  ceq         

我在System.String中发现了类似的东西:

public static bool Equals(String a, String b) {
    // Here
    if ((Object)a==(Object)b) {
        return true;
    }
    // ****

    if ((Object)a==null || (Object)b==null) {
        return false;
    }

    if (a.Length != b.Length)
        return false;

    return EqualsHelper(a, b);
}
4

3 回答 3

7

您的版本“Two”做了一些不同的事情:它比较引用相等(您可以ceq在编辑中添加的 IL 中看到这一点)。由于字符串实习,这通常在基本测试中起作用 - 但不应依赖它。它只是偶然地工作。

基本上,只需使用:

return str_01 == str02;

这是表达“比较这两个字符串是否相等”的惯用方式,它将内联到对string.Equals(string a, string b) 反正的调用。

于 2014-12-19T09:09:30.440 回答
4

比较引用更快,但字符串可以具有相同的值,即使它们不是同一个实例。由于比较做不同的事情,您不能将参考比较用作字符串比较的优化。

如果您比较两个具有相同值但不是同一个实例的字符串,您可以看到差异:

string str_01 = "ab";
string str_02 = String.Concat("a", "b");

Console.WriteLine(str_01 == str_02);
Console.WriteLine((object)str_01 == (object)str_02);

输出:

True
False

String.Equals当您比较两个实际上是相同实例的字符串时,该方法使用引用比较来捕获情况。如果字符串是单独的实例,它会继续比较字符串的值。

于 2014-12-19T09:19:33.527 回答
3

该方法Compare_01()Compare_02()没有同样的事情。第一个是比较字符串值,然后比较引用。尽管它们都将返回 true,因为 JIT 和运行时将创建一个字符串a并将相同的地址分配给两个变量。

每个字符串文字不一定会产生一个新的字符串实例。当根据字符串相等运算符(第 7.9.7 节)等效的两个或多个字符串文字出现在同一个程序集中时,这些字符串文字引用同一个字符串实例。例如,MSDN产生的输出

class Test 
{    static void Main() {
      object a = "hello";
      object b = "hello";
      System.Console.WriteLine(a == b);    
     } 
}

bool如果要比较值,为什么不简单地返回表达式结果(真或假)。

public static bool CompareStr(String str1 , String str2)
{
      return str1 == str2;
}
于 2014-12-19T09:09:01.613 回答