天天看點

從字元串中查找字元出現次數的方法和性能再比

他在裡面用了三種辦法來查找'A'在"SADTHDGSAFSDGTGHRDGSADFADDRHDFSGASDAA"中的出現次數,可是我的測試結果的差别完全沒有他的那麼明顯,三種方法最多也就相差2.5-2.7倍。也就是說周遊法和分割法隻有不到3倍的效率差别,下面是上面那個字元串被三種方法測試1M遍的結果:

    1、周遊統計長度: 613ms

    2、替換後比較長度: 1,064ms

    3、斷開字元串後計數: 1,611ms

    讨論後大家覺得一般情況下使用第二種方法是最經濟的,因為少的代碼會使程式的正确性得到提高,且在效率的損失也是可以接受的情況下。

    這裡可以對第二個方法有個優化,把:

    c1 = str.Length - str.Replace("A", "").Length;

    改成:

    StringBuilder strb = new StringBuilder(str);

    c1 = str.Length - strb.Replace("A", "").Length;

    這次運作1M次的測試結果是:1,395ms,基本就是周遊法的兩倍,而且我們還可以發現,這個方法的時間有1/3都是消耗在第一句建立StringBuilder上面,在這個的測試中它花費了578ms。

    結下來是讨論了一下把str的采樣空間變大,我把str複制了20份,長度達到了740個位元組,這下測試1M次的結果如下:

    1、周遊統計長度: 11,583ms

    2、替換後比較長度: 17,454ms

    3、斷開字元串後計數: 26,953ms

    4、改進後的替換法比較: 18,625ms(其中12,518的時間消耗在StringBuilder的建立上)。

    可以看出StringBuilder裡的native方法是效率極高的,再刨去其建立時的消耗後甚至高過了周遊法

從字元串中查找字元出現次數的方法和性能再比

,可是StringBuilder的建立也是很費時間的,真是難以取舍呀。  

    測試環境:P4 2.4 512M WinXp .NET Framework 1.1.

    附測試代碼:

從字元串中查找字元出現次數的方法和性能再比

#region test code

從字元串中查找字元出現次數的方法和性能再比

using System;

從字元串中查找字元出現次數的方法和性能再比

using System.Text;

從字元串中查找字元出現次數的方法和性能再比
從字元串中查找字元出現次數的方法和性能再比

namespace CharCount

從字元串中查找字元出現次數的方法和性能再比

{

從字元串中查找字元出現次數的方法和性能再比

    /// <summary>

從字元串中查找字元出現次數的方法和性能再比

    /// Summary description for CharCount.

從字元串中查找字元出現次數的方法和性能再比

    /// </summary>

從字元串中查找字元出現次數的方法和性能再比

    class CharCount

從字元串中查找字元出現次數的方法和性能再比

    {

從字元串中查找字元出現次數的方法和性能再比

        /// <summary>

從字元串中查找字元出現次數的方法和性能再比

        /// The main entry point for the application.

從字元串中查找字元出現次數的方法和性能再比

        /// </summary>

從字元串中查找字元出現次數的方法和性能再比

        [STAThread]

從字元串中查找字元出現次數的方法和性能再比

        static void Main(string[] args)

從字元串中查找字元出現次數的方法和性能再比

        {

從字元串中查找字元出現次數的方法和性能再比

            string str = "SADTHDGSAFSDGTGHRDGSADFADDRHDFSGASDAA";

從字元串中查找字元出現次數的方法和性能再比
從字元串中查找字元出現次數的方法和性能再比

            long t;

從字元串中查找字元出現次數的方法和性能再比

            int len;

從字元串中查找字元出現次數的方法和性能再比

            string strTemp = string.Empty;

從字元串中查找字元出現次數的方法和性能再比

            for ( int i=0 ; i < 20 ; i++ )

從字元串中查找字元出現次數的方法和性能再比

            {

從字元串中查找字元出現次數的方法和性能再比

                strTemp += str;

從字元串中查找字元出現次數的方法和性能再比

            }

從字元串中查找字元出現次數的方法和性能再比

            str = strTemp;

從字元串中查找字元出現次數的方法和性能再比

            GC.Collect();

從字元串中查找字元出現次數的方法和性能再比
從字元串中查找字元出現次數的方法和性能再比

            DateTime dtBegin = DateTime.Now;

從字元串中查找字元出現次數的方法和性能再比

            for ( int j=0 ; j < 100000 ; j++ )

從字元串中查找字元出現次數的方法和性能再比
從字元串中查找字元出現次數的方法和性能再比

                /*len = 0;

從字元串中查找字元出現次數的方法和性能再比

                for ( int k=0 ; k < str.Length ; k++ )

從字元串中查找字元出現次數的方法和性能再比

                {

從字元串中查找字元出現次數的方法和性能再比

                    if ( str[k] == 'A')

從字元串中查找字元出現次數的方法和性能再比

                    {

從字元串中查找字元出現次數的方法和性能再比

                        len++;

從字元串中查找字元出現次數的方法和性能再比

                    }

從字元串中查找字元出現次數的方法和性能再比

                }*/

從字元串中查找字元出現次數的方法和性能再比

                //len = str.Length - str.Replace("A", "").Length;

從字元串中查找字元出現次數的方法和性能再比

                //len = str.Split(new char [] {'A'}).Length;

從字元串中查找字元出現次數的方法和性能再比

                StringBuilder strb = new StringBuilder(str);

從字元串中查找字元出現次數的方法和性能再比

                len = strb.Length - strb.Replace("A", "").Length;

從字元串中查找字元出現次數的方法和性能再比
從字元串中查找字元出現次數的方法和性能再比

            t = (long)(DateTime.Now - dtBegin).TotalMilliseconds;

從字元串中查找字元出現次數的方法和性能再比

            System.Console.WriteLine(str.Length + ": " + t);

從字元串中查找字元出現次數的方法和性能再比

            System.Console.Read();

從字元串中查找字元出現次數的方法和性能再比

        }

從字元串中查找字元出現次數的方法和性能再比

    }

從字元串中查找字元出現次數的方法和性能再比

}

從字元串中查找字元出現次數的方法和性能再比

#endregion

從字元串中查找字元出現次數的方法和性能再比

本文轉自部落格園鳥食軒的部落格,原文連結:http://www.cnblogs.com/birdshome/,如需轉載請自行聯系原部落客。

繼續閱讀