我正在阅读Microsoft 在.NET Framework中使用字符串的最佳实践.
它给出了以下示例作为对以下内容的介绍StringComparison.OrdinalIgnoreCase:
public static bool IsFileURI(string path)
{
return path.StartsWith("FILE:", StringComparison.OrdinalIgnoreCase);
}
Run Code Online (Sandbox Code Playgroud)
到现在为止还挺好.但它继续这样说:
但是,前面的示例使用该
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);
}
Run Code Online (Sandbox Code Playgroud)
我很难理解为什么第二个版本更好.我能理解从CompareTo(比较)到Equals(相等)的转换,但是也不是StartsWith一个相等的测试?我错过了什么或这是一个文档错误?
不是真正的答案,而是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 );
}
}
Run Code Online (Sandbox Code Playgroud)
结果是(毫秒):
String.StartsWith(): 90102
String.Equals(): 73113
Run Code Online (Sandbox Code Playgroud)
因此,就性能而言,第二种解决方案更好,大约快 20%。
| 归档时间: |
|
| 查看次数: |
302 次 |
| 最近记录: |