11

Microsoft のBest Practices for Using Strings in the .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);
}   

2 番目のバージョンの方が優れている理由を理解するのに苦労しています。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

したがって、パフォーマンスに関しては、2 番目のソリューションの方が優れており、約20% 高速です。

于 2012-10-01T21:01:12.393 に答える