[Performance][C#]String.Empty V.S “”

  • 24700
  • 0
  • C#
  • 2011-12-26

[Performance][C#]String.Empty V.S “”

在程式的寫作過程中,我們經常會需要指派空字串。但在.NET的程式語言中,空字串的指派除了指派"",我們也可以指派String.Empty。相信有人對於兩者的差異不甚了解,或是了解卻未實際比較。這邊隨手記錄一下自己做的整理與比較。

 

整理了網路上流佈的文章,大致上大家普遍認為使用String.Empty來取代""作指派空字串的動作,我們可以獲取較好的效能。

 

這邊讓我們先來看段實驗,實驗的Code如下:


        {
            EmptyString1(1);
            EmptyString2(1);
            EmptyString3(1);

            Console.Clear();
            int count = 1000000000;
            for (int idx = 0; idx < 3; ++idx)
            {             
                EmptyString1(count);
                EmptyString2(count);
                EmptyString3(count);
                Console.WriteLine();
            }
        }

        private static void EmptyString1(int count)
        {
            String test;
            Stopwatch sw = Stopwatch.StartNew();
            for (int idx = 0; idx < count; ++idx)
            {
                test = "";
            }
            sw.Stop();
            Console.WriteLine("EmptyString1: " + sw.ElapsedMilliseconds.ToString());
        }

        private static void EmptyString2(int count)
        {
            String test;
            Stopwatch sw = Stopwatch.StartNew();
            for (int idx = 0; idx < count; ++idx)
            {
                test = string.Empty;
            }
            sw.Stop();
            Console.WriteLine("EmptyString2: " + sw.ElapsedMilliseconds.ToString());
        }

        private static void EmptyString3(int count)
        {
            String test;
            Stopwatch sw = Stopwatch.StartNew();
            for (int idx = 0; idx < count; ++idx)
            {
                test = new String(' ',0);
            }
            sw.Stop();
            Console.WriteLine("EmptyString1: " + sw.ElapsedMilliseconds.ToString());
        }

 

當測試的次數為1000000,其實驗結果如下:
image

 

當測試的次數為10000000,其實驗結果如下:
image

 

當測試的次數為1000000000,其實驗結果如下:
image

 

由以上實驗可以看到String.Empty其實跟""是差不了多少的。這是因為若是使用""來作空字串的指派。程式會在使用時幫我們建立並指派空字串物件,第一次使用時雖然會需要額外的OverHead,但是由於在.NET中有字串池這樣的優化機制,因此這部分的OverHead被降到最小了,當後續再使用相同的字串,系統會自動至字串池取出以建立的來使用,這部份的概念可參閱筆者的[.Net Concept]理解並善用String pool這篇。而使用String.Empty來作空字串的指派動作,由於該屬性是String類別的唯讀靜態屬性,在使用上不會頻繁的建立空字串物件。

 

再看一下兩者所產生的MSIL有何差異。
image

 

我們可以發現兩者所產生的MSIL幾乎一樣,只有一行有所差異。

 

雖然String.Empty跟""這兩個設定空字串的方式在效能上幾乎沒有差異,但是筆者認為使用String.Empty較為直白,能的話還是建議使用String.Empty。

 

Link