IndexOf() LastIndexOf() Contains() StartsWith() EndsWith()方法比较

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.IO;
using System.Diagnostics;
 
namespace CA100
{
    class Program
    {
        //循环次数:5百万次
        const int COUNT = 5000000;
        //外围循环次数:5次
        const int NUM = 5;
        //准确测量运行时间
        static Stopwatch sWatch = new Stopwatch();
        //每项时间
        static long t1, t2;
        //记录日志
        static StringBuilder sb = new StringBuilder();
 
        static void Main()
        {
            string src = "C#测试IndexOf()LastIndexOf()Contains()StartsWith()EndsWith()5个方法的效率.";
            Console.WriteLine("测试的字符串是:" + src + ",测试次数" + COUNT);
            sb.AppendLine("测试的字符串是:" + src + ",测试次数" + COUNT);
            string str = "C";
            //每项循环测试5次
              int i = 0;
            Console.WriteLine(" 'C'出现在首位时: ");
            sb.AppendLine(" 'C'出现在首位时: ");
            for (; i < NUM; i++)
            {
                Console.WriteLine("当前循环第{0}次 ", i + 1);
                sb.AppendLine("当前循环第" + (i + 1) + "次");
                t1 += IndexOf(src, str);
                t2 += StartsWith(src, str);
                Console.WriteLine();
                sb.AppendLine();
            }
            Console.WriteLine("IndexOf总时间:" + t1 + ",平均时间:" + t1 / NUM);
            sb.AppendLine("IndexOf总时间:" + t1 + ",平均时间:" + t1 / NUM);
            Console.WriteLine("StartsWith总时间:" + t2 + ",平均时间:" + t2 / NUM);
            sb.AppendLine("StartsWith总时间:" + t2 + ",平均时间:" + t2 / NUM);
            Console.WriteLine();
            sb.AppendLine();
            t1 = 0;
            t2 = 0;
 
            str = "StartsWith";
            Console.WriteLine("'StartsWith'出现在中间: ");
            sb.AppendLine("'StartsWith'出现在中间: ");
            for (i = 0; i < NUM; i++)
            {
                Console.WriteLine("当前循环第{0}次 ", i + 1);
                sb.AppendLine("当前循环第" + (i + 1) + "次");
                t1 += IndexOf(src, str);
                t2 += Contains(src, str);
                Console.WriteLine();
                sb.AppendLine();
            }
 
            Console.WriteLine("IndexOf总时间:" + t1 + ",平均时间:" + t1 / NUM);
            sb.AppendLine("IndexOf总时间:" + t1 + ",平均时间:" + t1 / NUM);
            Console.WriteLine("Contains总时间:" + t2 + ",平均时间:" + t2 / NUM);
            sb.AppendLine("Contains总时间:" + t2 + ",平均时间:" + t2 / NUM);
            Console.WriteLine();
            sb.AppendLine();
            t1 = 0;
            t2 = 0;
 
            str = ".";
            Console.WriteLine("'.'出现在末尾: ");
            sb.AppendLine("'.'出现在末尾: ");
            for (i = 0; i < NUM; i++)
            {
                Console.WriteLine("当前循环第{0}次 ", i + 1);
                sb.AppendLine("当前循环第" + (i + 1) + "次");
                t1 += LastIndexOf(src, str);
                t2 += EndsWith(src, str);
                Console.WriteLine();
                sb.AppendLine();
            }
 
            Console.WriteLine("LastIndexOf总时间:" + t1 + ",平均时间:" + t1 / NUM);
            sb.AppendLine("LastIndexOf总时间:" + t1 + ",平均时间:" + t1 / NUM);
            Console.WriteLine("EndsWith总时间:" + t2 + ",平均时间:" + t2 / NUM);
            sb.AppendLine("EndsWith总时间:" + t2 + ",平均时间:" + t2 / NUM);
            Console.WriteLine();
            sb.AppendLine();
 
            Console.WriteLine("测试结束!");
            sb.AppendLine("测试结束!");
 
            File.AppendAllText(@"d: esults.txt", sb.ToString());
            Console.ReadLine();
        }
 
        static long IndexOf(string src, string str)
        {
            sWatch.Reset();
            sWatch.Start();
            for (int i = 0; i < COUNT; i++)
            {
                src.IndexOf(str);
            }
            sWatch.Stop();
 
            Console.WriteLine("IndexOf花费: " + sWatch.ElapsedMilliseconds + "ms");
            sb.AppendLine("IndexOf花费: " + sWatch.ElapsedMilliseconds + "ms");
            return sWatch.ElapsedMilliseconds;
        }
 
        static long LastIndexOf(string src, string str)
        {
            sWatch.Reset();
            sWatch.Start();
            for (int i = 0; i < COUNT; i++)
            {
                src.LastIndexOf(str);
            }
            sWatch.Stop();
 
            Console.WriteLine("LastIndexOf花费: " + sWatch.ElapsedMilliseconds + "ms");
            sb.AppendLine("LastIndexOf花费: " + sWatch.ElapsedMilliseconds + "ms");
            return sWatch.ElapsedMilliseconds;
        }
 
        static long StartsWith(string src, string str)
        {
            sWatch.Reset();
            sWatch.Start();
            for (int i = 0; i < COUNT; i++)
            {
                src.StartsWith(str);
            }
            sWatch.Stop();
 
            Console.WriteLine("StartsWith花费: " + sWatch.ElapsedMilliseconds + "ms");
            sb.AppendLine("StartsWith花费: " + sWatch.ElapsedMilliseconds + "ms");
            return sWatch.ElapsedMilliseconds;
        }
 
        static long EndsWith(string src, string str)
        {
            sWatch.Reset();
            sWatch.Start();
            for (int i = 0; i < COUNT; i++)
            {
                src.EndsWith(str);
            }
            sWatch.Stop();
 
            Console.WriteLine("EndsWith花费: " + sWatch.ElapsedMilliseconds + "ms");
            sb.AppendLine("EndsWith花费: " + sWatch.ElapsedMilliseconds + "ms");
            return sWatch.ElapsedMilliseconds;
        }
 
        static long Contains(string src, string str)
        {
            sWatch.Reset();
            sWatch.Start();
            for (int i = 0; i < COUNT; i++)
            {
                src.Contains(str);
            }
            sWatch.Stop();
 
            Console.WriteLine("Contains花费: " + sWatch.ElapsedMilliseconds + "ms");
            sb.AppendLine("Contains花费: " + sWatch.ElapsedMilliseconds + "ms");
            return sWatch.ElapsedMilliseconds;
        }
    }
}

针对三种情况

1.判断以字符串开头

IndexOf和StartsWith

2.判断是否包含字符串

IndexOf和Contains

3.判断以字符串结尾

LastIndexOf和EndsWith

测试以某字符串为开头,以使用IndexOf为最佳,有时,StartsWith也会比IndexOf快,几率较低。

测试包含字符串,以Contains最佳。

测试以某字符串结尾,虽然LastIndexOf速度略快,但是不好判定,还是采用EndsWith为最佳。

[C#] 纯文本查看 复制代码
01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
public partial class Form1 : Form
   {
       public Form1()
       {
           InitializeComponent();
       }
       string url = "http://www.0398jobs.com/index.htm";
       private void Form1_Load(object sender, EventArgs e)
       {
 
       }
       //
       private void button1_Click(object sender, EventArgs e)
       {
           label1.Text = string.Empty;
           DateTime st = DateTime.Now;
           for (int i = 0; i < 10000; i++)
           {
               if (url.IndexOf("job.com") > 0 || url.IndexOf("jobs.com") > 0)
               {
 
               }
           }
           label1.Text = (DateTime.Now - st).Milliseconds.ToString();
       }
       //Contains
       private void button2_Click(object sender, EventArgs e)
       {
           label1.Text = string.Empty;
           DateTime st = DateTime.Now;
           for (int i = 0; i < 10000; i++)
           {
               if (url.Contains("job.com") || url.Contains("jobs.com"))
               {
 
               }
           }
           label1.Text = (DateTime.Now-st).Milliseconds.ToString();
       }
   }



看测试后的效果

IndexOf执行五次

[C#] 纯文本查看 复制代码
01
02
03
04
05
06
38毫秒
36 毫秒
37毫秒
36毫秒
36毫秒
39毫秒



Contains执行五次

[C#] 纯文本查看 复制代码
01
02
03
04
05
06
3毫秒
2 毫秒
2毫秒
3毫秒
2毫秒
2毫秒



差距这么大我就不多说了,大家一看就明白
Contains的性能要远远的超出IndexOf
测试源码下载

原文地址:https://www.cnblogs.com/blogzys/p/10130971.html