Подтвердить что ты не робот

Должны ли запускаться только для заказа?

Я читал 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 также тест равенства? Я что-то пропустил или это ошибка документации?

4b9b3361

Ответ 1

Не настоящий ответ, но StartsWith() - это тест на равенство, и я думаю, что это ошибка документации, но мне было любопытно узнать результаты, поэтому я сделал banchmark, используя следующий код:

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% быстрее.