判断字符串为空方法性能对比实验

今天,看到一篇博文,对判断字符串是否为空的几种方法做了一下性能对比。文中并没有给出实例代码,只是给出了最终结果,出于兴趣,我就写了点实例代码,将对比实验重新做了一遍。现对实验做个小小的总结。

bool isEmpty1 = (s == "");
bool isEmpty2 = (s == string.Empty);
bool isEmpty3 = (s.Equals(""));
bool isEmpty4 = (s.Equals(string.Empty));
bool isEmpty5 = (s.Length == 0);

实验比较内容包含:一开始,我的实验代码如下:

string s = "";
Stopwatch stopwatch1 = new Stopwatch();
stopwatch1.Start(); //开始监视
bool isEmpty1 = (s == "");           
stopwatch1.Stop(); //停止监视
TimeSpan timespan1 = stopwatch1.Elapsed;
Console.WriteLine("代码片段1执行时间为:" + timespan1.ToString());

Stopwatch stopwatch2 = new Stopwatch();
stopwatch2.Start(); //开始监视
bool isEmpty2 = (s == string.Empty);
stopwatch2.Stop(); //停止监视
TimeSpan timespan2 = stopwatch2.Elapsed;
Console.WriteLine("代码片段2执行时间为:" + timespan2.ToString());

Stopwatch stopwatch3 = new Stopwatch();
stopwatch3.Start(); //开始监视
bool isEmpty3 = (s.Equals(""));
stopwatch3.Stop(); //停止监视
TimeSpan timespan3 = stopwatch3.Elapsed;
Console.WriteLine("代码片段3执行时间为:" + timespan3.ToString());

Stopwatch stopwatch4 = new Stopwatch();
stopwatch4.Start(); //开始监视
bool isEmpty4 = (s.Equals(string.Empty));
stopwatch4.Stop(); //停止监视
TimeSpan timespan4 = stopwatch4.Elapsed; //获取代码运行时间
Console.WriteLine("代码片段4执行时间为:" + timespan4.ToString());

Stopwatch stopwatch5 = new Stopwatch();
stopwatch5.Start(); //开始监视
bool isEmpty5 = (s.Length == 0);
stopwatch5.Stop(); //停止监视
TimeSpan timespan5 = stopwatch5.Elapsed; //获取代码运行时间
Console.WriteLine("代码片段5执行时间为:" + timespan5.ToString());

实验结果(其中较典型的一次)则为:

上面给出的只是其中较典型的一次,每次结果略有区别,但是还是可以确定最终结果的,花费时间从多到少依次为:

bool isEmpty5 = (s.Length == 0);
bool isEmpty1 = (s == "");
bool isEmpty2 = (s == string.Empty);
bool isEmpty3 = (s.Equals(""));
bool isEmpty4 = (s.Equals(string.Empty));

这时,就出现了一个问题,因为在很多文章中都提到,bool isEmpty5 = (s.Length == 0);方法的效率本应该是最高的,但是在本例中却是最低的。所以,感觉是不是执行次数较少,导致结果异常,所以,修改实例代码如下:

string s = "";
Stopwatch stopwatch1 = new Stopwatch();
stopwatch1.Start(); //开始监视
for (int i = 0; i < 100000; i++)
{
     bool isEmpty = (s == "");
}
stopwatch1.Stop(); //停止监视
TimeSpan timespan1 = stopwatch1.Elapsed;
Console.WriteLine("代码片段1执行时间为:" + timespan1.ToString());

Stopwatch stopwatch2 = new Stopwatch();
stopwatch2.Start(); //开始监视
for (int i = 0; i < 100000; i++)
{
     bool isEmpty = (s == string.Empty);
}
stopwatch2.Stop(); //停止监视
TimeSpan timespan2 = stopwatch2.Elapsed;
Console.WriteLine("代码片段2执行时间为:" + timespan2.ToString());

Stopwatch stopwatch3 = new Stopwatch();
stopwatch3.Start(); //开始监视
for (int i = 0; i < 100000; i++)
{
     bool isEmpty = (s.Equals(""));
}
stopwatch3.Stop(); //停止监视
TimeSpan timespan3 = stopwatch3.Elapsed;
Console.WriteLine("代码片段3执行时间为:" + timespan3.ToString());

Stopwatch stopwatch4 = new Stopwatch();
stopwatch4.Start(); //开始监视
for (int i = 0; i < 100000; i++)
{
     bool isEmpty = (s.Equals(string.Empty));
}
stopwatch4.Stop(); //停止监视
TimeSpan timespan4 = stopwatch4.Elapsed; //获取代码运行时间
Console.WriteLine("代码片段4执行时间为:" + timespan4.ToString());

Stopwatch stopwatch5 = new Stopwatch();
stopwatch5.Start(); //开始监视
for (int i = 0; i < 100000; i++)
{
     bool isEmpty = (s.Length == 0);
}
stopwatch5.Stop(); //停止监视
TimeSpan timespan5 = stopwatch5.Elapsed; //获取代码运行时间
Console.WriteLine("代码片段5执行时间为:" + timespan5.ToString());

此时运行结果(其中较典型的一次)为:

多次实验,归纳出实验结果,从前往后耗时依次增多:

bool isEmpty5 = (s.Length == 0);
bool isEmpty1 = (s == "");
bool isEmpty3 = (s.Equals(""));
bool isEmpty2 = (s == string.Empty);
bool isEmpty4 = (s.Equals(string.Empty));

最后,将循环次数改为100000000再次执行程序,得到以下结果(其中较典型的一次)

多次实验,归纳出实验结果,从前往后耗时依次增多:

bool isEmpty5 = (s.Length == 0);
bool isEmpty1 = (s == "");
bool isEmpty3 = (s.Equals(""));
bool isEmpty4 = (s.Equals(string.Empty));
bool isEmpty2 = (s == string.Empty);

现在,bool isEmpty5 = (s.Length == 0);的效率确实是最高的。

至于bool isEmpty5 = (s.Length == 0);效率高的原因分析,请参考以下两篇文章:

1.C# 关于判断字符串为空的一些方法

http://www.189works.com/article-10540-1.html

2.C#中判断空字符串的4种方法性能比较与分析

http://tech.ddvip.com/2009-02/1235465379109630.html

最后,得稍微说明一下:

这篇文章并不是想在这几种方法中找出孰好孰坏,也不想给出使用的建议。完全是由于感兴趣,做了这个实验。并且在实验时碰到了那么个问题,所以想拿出来分享一下。所以也就不便给出什么结论性的东西了。当然,实验是具有随机性的,要是有什么不妥的地方还请大家指正。

原文地址:https://www.cnblogs.com/suncoolcat/p/3297377.html