今天,看到一篇博文,对判断字符串是否为空的几种方法做了一下性能对比。文中并没有给出实例代码,只是给出了最终结果,出于兴趣,我就写了点实例代码,将对比实验重新做了一遍。现对实验做个小小的总结。
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
最后,得稍微说明一下:
这篇文章并不是想在这几种方法中找出孰好孰坏,也不想给出使用的建议。完全是由于感兴趣,做了这个实验。并且在实验时碰到了那么个问题,所以想拿出来分享一下。所以也就不便给出什么结论性的东西了。当然,实验是具有随机性的,要是有什么不妥的地方还请大家指正。