C#中string.contains和string.indexof的效率比较

今天去面试,面试官问到了题目中的问题,string.contains和string.indexof两个字符串查找方法相比哪个处理效率更高。当时完全不了解,今天回来特意查了一下,顺便和大家分享一下。

首先,我们先来单纯的从大数据角度测试一下。打开VS2010,创建一个控制台应用程序,写如下代码:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;


namespace TestStingContains
{
    class Program
    {
        static void Main(string[] args)
        {
            string something = GetAString();
            Console.WriteLine("Contains Begin at {0}:{1}", System.DateTime.Now.ToString(),System.DateTime.Now.Millisecond.ToString());
            something.Contains("Cc");
            Console.WriteLine("Contains End at {0}:{1}", System.DateTime.Now.ToString(), System.DateTime.Now.Millisecond.ToString());
            Console.WriteLine("IndexOf Begin at {0}:{1}", System.DateTime.Now.ToString(), System.DateTime.Now.Millisecond.ToString());
            something.IndexOf("Cc");
            Console.WriteLine("IndexOf End at {0}:{1}", System.DateTime.Now.ToString(), System.DateTime.Now.Millisecond.ToString());
            Console.ReadKey();
        }


        private static string GetAString()
        {
            StringBuilder teststring=new StringBuilder();
            for (int i = 0; i < 10000000; i++)
            {
                teststring.Append("AaBb");
            }
            teststring.Append("Cc");
            for (int i = 0; i < 1000; i++)
            {
                teststring.Append("AaBb");
            }
            return teststring.ToString();
        }
    }

创建一个长string字符串,然后分别用contains和indexof查找其中某个string,显示结果如下:

C#中string.contains和string.indexof的效率比较_第1张图片

从结果中可以看到,Contains用了28毫秒,而indexof用了665毫秒。当然,这并不是一个规范的测试,但是我们仍然可以发现,对于大数据的处理,这两个方法显然不在一个数量级上。Contains要快得多。那么这是为什么呢?


现在,我们用Reflector查看一下这两个方法内部的实现到底是什么样的?

        这是Contains(string):

	public bool Contains(string value)
        {
            return (this.IndexOf(value, StringComparison.Ordinal) >= 0);
        }
	
	下面是IndexOf(string):
	public int IndexOf(string value)
        {
            return this.IndexOf(value, StringComparison.CurrentCulture);
        }
要说有什么不同,其实也就是StringComparison的不同,那么为什么两个比较类型StringComparison.Ordinal和StringComparison.CurrentCulture在效率上会有这么大的差别呢?那下面我们得研究一下这两种比较类型的特点了。

我从MSDN上http://msdn.microsoft.com/en-us/library/dd465121.aspx 找到了这么一句话:

Use comparisons with StringComparison.Ordinal or StringComparison.OrdinalIgnoreCase for better performance.

从上面地址中我们还可以获取一些其他信息,在String Comparisons that Use the Current Culture一栏中提到对于使用CurrentCulture参数,每次都需要检查当前环境信息,个人怀疑可能是这一点耗费了效率。当然,这个页面内容我没有全部看完,如果有兴趣的童鞋可以仔细看看,说不定会有更多收获,这里就不求甚解了。

 IndexOf实际上还有IndexOf(string,StringComparison.Ordinal)的重载方法,那么这个方法应该和Contains效率一样吧,我们修改一下上面的程序,将

something.IndexOf("Cc");改为something.IndexOf("Cc",StringComparison.Ordinal);再试一下。得到结果如下:

C#中string.contains和string.indexof的效率比较_第2张图片

我们发现,确实差不多,IndexOf(string,StringComparison.Ordinal)比Contains快那么一丁点。

但是为了写起来方便呢,看起来美观,以后处理大数据的时候可以尽量用Contains啦。

你可能感兴趣的:(C#)