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


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

    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

    最后,得稍微说明一下:

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

  • 相关阅读:
    async 函数《ES6标准入门(第3版)》
    作用域是什么《你不知道的JavaScript(上)》
    Module 的加载实现《ES6标准入门(第3版)》
    数组的扩展《ES6标准入门(第3版)》
    【H5】真机调试
    Iterator 和 for...of 循环《ES6标准入门(第3版)》
    Promise 对象《ES6标准入门(第3版)》
    函数作用域和块作用域《你不知道的JavaScript(上)》
    macOS终端修改DNS
    Vue横向滚动鼠标控制
  • 原文地址:https://www.cnblogs.com/suncoolcat/p/3297377.html
Copyright © 2020-2023  润新知