与字符串相比性能最佳.空(c#)

本文关键字:最佳 性能 字符串 | 更新日期: 2023-09-27 18:21:25

之间有什么区别吗

if(string.Empty.Equals(text))

if(text.Equals(string.Empty))

关于性能、意外行为或可读性?

与字符串相比性能最佳.空(c#)

这些将具有相同的性能特征。

如果textnull,那么您的第二行将抛出一个NullReferenceException

我个人发现:

if(text == string.Empty)

比任何一个选项都可读。

还有内置的:

if(string.IsNullOrEmpty(text))

对于.NET 4.0:

if(string.IsNullOrWhitespace(text))

关于性能,它们的行为将相同。关于意外行为,如果text=null,第二个可能抛出NullReferenceExceptionif (!string.IsNullOrEmpty(text))似乎更自然地实现了相同的事情(相同的性能,相同的结果),而没有不希望的意外行为和NRE的可能性。

我建议使用

if (string.IsNullOrEmpty(text))
{
}

因为我认为它更可读,这在这里是最重要的IMO(实际上,null值的结果不一样,但您的第二个版本会为这个特定的测试用例抛出一个异常)。

我不知道生成的IL是否有任何差异,但无论如何,这样的微优化(如果有的话…)显然不会让你的应用程序更快。


编辑:

我只是好奇地测试了一下:

private static void Main(string[] args)
{
    Stopwatch z1 = new Stopwatch();
    Stopwatch z2 = new Stopwatch();
    Stopwatch z3 = new Stopwatch();
    int count = 100000000;
    string text = "myTest";
    z1.Start();
    for (int i = 0; i < count; i++)
    {
        int tmp = 0;
        if (string.Empty.Equals(text))
        {
            tmp++;
        }
    }
    z1.Stop();
    z2.Start();
    for (int i = 0; i < count; i++)
    {
        int tmp = 0;
        if (text.Equals(string.Empty))
        {
            tmp++;
        }
    }
    z2.Stop();
    z3.Start();
    for (int i = 0; i < count; i++)
    {
        int tmp = 0;
        if (string.IsNullOrEmpty(text))
        {
            tmp++;
        }
    }
    z3.Stop();
    Console.WriteLine(string.Format("Method 1: {0}", z1.ElapsedMilliseconds));
    Console.WriteLine(string.Format("Method 2: {0}", z2.ElapsedMilliseconds));
    Console.WriteLine(string.Format("Method 3: {0}", z3.ElapsedMilliseconds));
    Console.ReadKey();
}

不确定测试是否相关,因为测试微观优化总是比看起来更复杂,但以下是一些结果:

Method 1: 611
Method 2: 615
Method 3: 336

方法1和2与预期完全相同,方法3是可读性更强的解决方案IMO,看起来是最快的解决方案,所以请做出选择;)

它们是等价的。

第一种情况:

IL_0000: nop
IL_0001: ldsfld string [mscorlib]System.String::Empty
IL_0006: ldarg.0
IL_0007: callvirt instance bool [mscorlib]System.String::Equals(string)
IL_000c: ldc.i4.0
IL_000d: ceq
IL_000f: stloc.0
IL_0010: ldloc.0
IL_0011: brtrue.s <target>

第二种情况:

IL_0000: nop
IL_0001: ldarg.0
IL_0002: ldsfld string [mscorlib]System.String::Empty
IL_0007: callvirt instance bool [mscorlib]System.String::Equals(string)
IL_000c: ldc.i4.0
IL_000d: ceq
IL_000f: stloc.0
IL_0010: ldloc.0
IL_0011: brtrue.s <target>

在这种情况下应该没有性能差异。这就像将"x==y"与"y==x"进行比较。

我想说if (text == string.Empty)是最可读的语法,但那只是我自己

当然,您也可以使用if (string.IsNullOrEmpty(text)) { }string.IsNullOrWhiteSpace(text)

至于意外行为,这是一个非常简单的字符串比较。我无法想象你会从中得到意想不到的行为。