他在裡面用了三種辦法來查找'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/,如需轉載請自行聯系原部落客。