Why is function isprefix faster than Startswith in C#?

前端 未结 4 697
一生所求
一生所求 2021-02-04 03:10

Does anyone know why C# (.NET)\'s StartsWith function is considerably slower than IsPrefix?

4条回答
  •  逝去的感伤
    2021-02-04 03:32

    Check out the source of IsPrefix. The thing is - in some cases, it's going to be slower than StartsWith just because it actually uses StartsWith and does few more operations.

        [System.Security.SecuritySafeCritical]  // auto-generated
        public unsafe virtual bool IsPrefix(String source, String prefix, CompareOptions options)
        { 
            if (source == null || prefix == null) {
                throw new ArgumentNullException((source == null ? "source" : "prefix"), 
                    Environment.GetResourceString("ArgumentNull_String")); 
            }
            Contract.EndContractBlock(); 
            int prefixLen = prefix.Length;
    
            if (prefixLen == 0)
            { 
                return (true);
            } 
    
            if (options == CompareOptions.OrdinalIgnoreCase)
            { 
                return source.StartsWith(prefix, StringComparison.OrdinalIgnoreCase);
            }
    
            if (options == CompareOptions.Ordinal) 
            {
                return source.StartsWith(prefix, StringComparison.Ordinal); 
            } 
    
            if ((options & ValidIndexMaskOffFlags) != 0) { 
                throw new ArgumentException(Environment.GetResourceString("Argument_InvalidFlag"), "options");
            }
    
    
            // to let the sorting DLL do the call optimization in case of Ascii strings, we check if the strings are in Ascii and then send the flag RESERVED_FIND_ASCII_STRING  to
            // the sorting DLL API SortFindString so sorting DLL don't have to check if the string is Ascii with every call to SortFindString. 
    
            return (InternalFindNLSStringEx(
                        m_dataHandle, m_handleOrigin, m_sortName, 
                        GetNativeCompareFlags(options) | Win32Native.FIND_STARTSWITH | ((source.IsAscii() && prefix.IsAscii()) ? RESERVED_FIND_ASCII_STRING : 0),
                        source, source.Length, 0, prefix, prefix.Length) > -1);
        }
    

提交回复
热议问题