比较4种判断空字符串的测试代码

东dong哥 2012-03-31 12:35:00
我用了四种比较方法,测试哪种的判断速度会比较快。
可是不知道为啥,测试结果总是变动,得不出最终答案,是不是我测试错了?

四种方法:(string item)
(1)0 == item.Length
(2)"" == item
(3)String.Empty == item
(4)String.IsNullOrEmpty(item)


测试代码如下:

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

namespace TestNullStrCmp
{
class Program
{
//private String strBase = new String("a");
static void Main(string[] args)
{
//定义
string strBase = "abc"+"";
Random rd = new Random();
List<string> ls = new List<string>();
string str="";
//strng str=Sring.Empty;
int k = 0;
int k1 = 0, k2 = 0, k3 = 0, k4 = 0;

//构造一个列表,里面有很多字符串和空字符串
for (int j = 1; j < 1000000; j++)
{
k++;
for (int i = 0; i < 4; i++)
{
StringBuilder sb = new StringBuilder();
sb.Append(strBase[rd.Next(0, strBase.Length)]);
}
if (k % 2 == 0)
ls.Add(str);
else
ls.Add("");
}

//使用四种方法进行判断

//方法一
Stopwatch timer1 = new Stopwatch();
timer1.Start();
foreach (var item in ls)
{
if (0 == item.Length)
k1=0;
}
timer1.Stop();
Console.WriteLine("对于0 == item.Length");
Console.WriteLine(timer1.Elapsed.Milliseconds + "ms");
Console.WriteLine();
//Console.WriteLine("k1: {0}", k1);

//方法二
Stopwatch timer2 = new Stopwatch();
timer2.Start();
foreach (var item in ls)
{
if ("" == item)
k2=0;
}
timer2.Stop();
Console.WriteLine("对于\"\" == item");
Console.WriteLine(timer2.Elapsed.Milliseconds + "ms");
Console.WriteLine();
//Console.WriteLine("k2: {0}",k2);

//方法三
Stopwatch timer3 = new Stopwatch();
timer3.Start();
foreach (var item in ls)
{
if (String.Empty == item)
k3=0;
}
timer3.Stop();
Console.WriteLine("对于String.Empty == item");
Console.WriteLine(timer3.Elapsed.Milliseconds + "ms");
Console.WriteLine();
//Console.WriteLine("k3: {0}", k3);
/*
//方法四
Stopwatch timer4 = new Stopwatch();
timer4.Start();
foreach (var item in ls)
{
if (String.IsNullOrEmpty(item))
k4=0;
}
timer4.Stop();
Console.WriteLine("对于String.IsNullOrEmpty(item)");
Console.WriteLine(timer4.Elapsed.Milliseconds + "ms");
Console.WriteLine();
//Console.WriteLine("k4: {0}", k4);
*/
Console.ReadKey();
}
}
}




方法一:0 == item.Length
方法二:"" == item
方法三:String.Empty == item
方法四:String.IsNullOrEmpty(item)

还没屏蔽方法四的测试结果:
结果1
方法一:20ms
方法二:14ms
方法三:13ms
方法四:14ms

结果2
方法一:16ms
方法二:13ms
方法三:14ms
方法四:13ms

屏蔽掉方法四后的结果:

结果3
方法一:16ms
方法二:15ms
方法三:15ms

结果4
方法一:17ms
方法二:16ms
方法三:16ms

结果5
方法一:16ms
方法二:16ms
方法三:15ms

结果6
方法一:15ms
方法二:16ms
方法三:15ms


网上不是说 0==item.Length 最快的吗????????????
...全文
268 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
sundayX 2012-03-31
  • 打赏
  • 举报
回复
个人感觉,item.Length应该不是最快的,不过也取决于计算length时的算法。
""==item和string.Empty==item应该是差不多。
string.IsNullorEmpty(item)由于计算了null和空两种情况,可能会比第2和3慢一点。
0c0c0f 2012-03-31
  • 打赏
  • 举报
回复
可能是windows操作系统不是实时操作系统的缘故吧,你那数据量还可以,我也认为0 == item.Length
最快!
cheng2005 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 的回复:]

引用 13 楼 的回复:

另外,你把String.Empty == item改成String.Empty.Equals(item)似乎要快点,估计是Equals这个方法内部实现引起的


有这个方法么?可否贴个官网文档的链接?
[/Quote]
这是因为string重载了==,在==里面调用了,Equals,用==相当于多了一层方法调用

[TargetedPatchingOptOut("Performance critical to inline across NGen image boundaries")]
public static bool operator ==(string a, string b)
{
return Equals(a, b);
}

东dong哥 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 13 楼 的回复:]

另外,你把String.Empty == item改成String.Empty.Equals(item)似乎要快点,估计是Equals这个方法内部实现引起的
[/Quote]

有这个方法么?可否贴个官网文档的链接?
东dong哥 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

还有一个比较重要的区别。
在switch语句中,case条件必须是常量。
所以,""可以做case条件,而string.Empty不行。
[/Quote]

谢谢,学习了。
EnForGrass 2012-03-31
  • 打赏
  • 举报
回复
另外,你把String.Empty == item改成String.Empty.Equals(item)似乎要快点,估计是Equals这个方法内部实现引起的
种草德鲁伊 2012-03-31
  • 打赏
  • 举报
回复
直接String.IsNullOrEmpty 方便省事。
cheng2005 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

引用 6 楼 的回复:

引用 5 楼 的回复:

把0 == item.Length改成
item.Length == 0

那样改应该会稍微稳定点,总的来说item.Length == 0确实要比其他判断快一点,第一种和第二种相差不大


测试了十多组数据,基本在15ms 16ms 17ms之间,其实写成0 == item.Length是避免出现item.Length……
[/Quote]
一看就是C出身
东dong哥 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 的回复:]

引用 5 楼 的回复:

把0 == item.Length改成
item.Length == 0

那样改应该会稍微稳定点,总的来说item.Length == 0确实要比其他判断快一点,第一种和第二种相差不大
[/Quote]

测试了十多组数据,基本在15ms 16ms 17ms之间,其实写成0 == item.Length是避免出现item.Length=0这种赋值的情况出现。
cheng2005 2012-03-31
  • 打赏
  • 举报
回复
还有一个比较重要的区别。
在switch语句中,case条件必须是常量。
所以,""可以做case条件,而string.Empty不行。
cheng2005 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 的回复:]

引用 2 楼 的回复:

个人感觉,item.Length应该不是最快的,不过也取决于计算length时的算法。
""==item和string.Empty==item应该是差不多。
string.IsNullorEmpty(item)由于计算了null和空两种情况,可能会比第2和3慢一点。


文档对string.Empty是这样定义的:
public static read……
[/Quote]
不得不说还是有区别的
"" 是常量,设计时确定的,运行时没有取值的过程。
string.Empty 是变量,运行时确定,在程序执行到这的时候会有一次去内存中取这个变量值的过程。
东dong哥 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 的回复:]

个人感觉,item.Length应该不是最快的,不过也取决于计算length时的算法。
""==item和string.Empty==item应该是差不多。
string.IsNullorEmpty(item)由于计算了null和空两种情况,可能会比第2和3慢一点。
[/Quote]

文档对string.Empty是这样定义的:
public static readonly string Empty

此字段的值为零长度字符串 ""。

在应用程序代码中,此字段最常用于赋值,以便将字符串变量初始化为空字符串。

所以string.Empty和""是一样的
EnForGrass 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 的回复:]

把0 == item.Length改成
item.Length == 0
[/Quote]
那样改应该会稍微稳定点,总的来说item.Length == 0确实要比其他判断快一点,第一种和第二种相差不大
EnForGrass 2012-03-31
  • 打赏
  • 举报
回复
把0 == item.Length改成
item.Length == 0
东dong哥 2012-03-31
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 的回复:]

可能是windows操作系统不是实时操作系统的缘故吧,你那数据量还可以,我也认为0 == item.Length
最快!
[/Quote]

网上有一个测试案例:http://blog.csdn.net/21aspnet/article/details/1588047,数据大的表示速度快(我不明白)。虽然不明白他那种测试方法,不过好像感觉有说服力似的.....
sundayX 2012-03-31
  • 打赏
  • 举报
回复
item.Length最快,有可能。嗯,学习了。

111,126

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Creator Browser
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧