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("\n'C'出现在首位时:\n"); sb.AppendLine("\r\n'C'出现在首位时:\r\n"); for (; i < NUM; i++) { Console.WriteLine("当前循环第{0}次\n", 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'出现在中间:\n"); sb.AppendLine("'StartsWith'出现在中间:\r\n"); for (i = 0; i < NUM; i++) { Console.WriteLine("当前循环第{0}次\n", 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("'.'出现在末尾:\n"); sb.AppendLine("'.'出现在末尾:\r\n"); for (i = 0; i < NUM; i++) { Console.WriteLine("当前循环第{0}次\n", 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:\results.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
测试源码下载
浙公网安备 33010602011771号