11

我正在阅读 Microsoft在 .NET Framework 中使用字符串的最佳实践

它给出了以下示例作为介绍StringComparison.OrdinalIgnoreCase

public static bool IsFileURI(string path) 
{
    return path.StartsWith("FILE:", StringComparison.OrdinalIgnoreCase);
}

到目前为止,一切都很好。但它接着说:

但是,前面的示例使用该String.StartsWith(String, StringComparison)方法来测试是否相等。因为比较的目的是测试是否相等而不是对字符串进行排序,所以更好的选择是调用该Equals方法,如下例所示。

public static bool IsFileURI(string path)
{
    if (path.Length < 5) return false;

    return String.Equals(path.Substring(0, 5), "FILE:", 
                         StringComparison.OrdinalIgnoreCase);
}   

我很难理解为什么第二个版本更好。我可以理解从CompareTo(比较)到Equals(平等)的转换,但不StartsWith也是平等测试吗?我错过了什么还是这是一个文档错误?

4

1 回答 1

3

不是一个真正的答案,而是StartsWith()一个平等测试,我认为这是一个文档错误,但我很想知道性能,所以我使用以下代码做了一个基准测试:

class Program {
    static void Main( string[ ] args ) {
        Stopwatch sw = Stopwatch.StartNew( );
        for ( int i = 0; i < 1000000000; i++ ) //1 billion times
            IsFileURI1( "File:\\ThisIsATest" );
        sw.Stop( );
        Console.WriteLine( "String.StartsWith(): " + sw.ElapsedMilliseconds.ToString( ) );

        sw.Restart( );
        for ( int i = 0; i < 1000000000; i++ ) //1 billion times
            IsFileURI2( "File:\\ThisIsATest" );
        sw.Stop( );
        Console.WriteLine( "String.Equals(): " + sw.ElapsedMilliseconds.ToString( ) );
    }

    public static bool IsFileURI1( string path ) {
        return path.StartsWith( "FILE:", StringComparison.OrdinalIgnoreCase );
    }

    public static bool IsFileURI2( string path ) {
        if ( path.Length < 5 ) return false;

        return String.Equals( path.Substring( 0, 5 ), "FILE:", StringComparison.OrdinalIgnoreCase );
    }   
}

结果是(毫秒):

String.StartsWith(): 90102 
String.Equals(): 73113

所以就性能而言,第二种解决方案更好,大约快 20%

于 2012-10-01T21:01:12.393 回答