[C#]should I need to put const on local strings

最近幾次被code review,有位同事建議我一些變數加上const,

但另位同事則覺得沒有多大效益,

起初我認為const對執行時間應該沒多大影響(雖然ReSharp希望我轉換為constant)。

我請教了建議加上const的同事,同事說加上const對.NET assembly有瘦身效果,

另外可讀性也比較高,但就不知道對執行時間有多少影響,這篇我就簡單測試執行時間是否有明顯差異。

[TestMethod]
        public void TestMethod1()
        {
            ShowMsg();
            ShowMsgWithConst();
        }

        private void ShowMsg()
        {
            string content = "ricoisme";
            Console.WriteLine(content);
        }

        private void ShowMsgWithConst()
        {
            const string content = "ricoisme";
            Console.WriteLine(content);
        }

 

我們來看一下IL code並簡單解釋一下

ShowMsg()

IL_0001:我宣告字串ricoisme

IL_0006:我從stack讀出該屬性,並存放在local變數 “0”

IL_0007:讀取變數0並放置evaluation stack

IL_0008:呼叫console.weiteline方法(包含參數)

 

ShowMsgWithConst()

可以看到使用const確實有瘦身效果(少了2行IL code,code size也少2),

下面我跑迴圈測試看看執行時間是否有明顯差距。

 

public string SimpleTest(int maxSize, int average, params Action[] doTests)
        {
            var output = new StringBuilder();
            foreach (var itemTest in doTests)
            {
                double totalMs = 0;
                for (var i = 0; i < average; i++)
                {
                    var start = DateTime.Now;
                    for (var j = 0; j < maxSize; j++)
                        itemTest();

                    var ms = (DateTime.Now - start).TotalMilliseconds;
                    totalMs += ms;

                    Console.Write("Sleeping...");
                    System.Threading.Thread.Sleep(50);
                    Console.WriteLine(" Done (" + ms + ")");
                }
                output.Append(itemTest.Method.Name).Append(" : ")
                    .Append( (totalMs / maxSize).ToString("f5") )
                    .Append(Environment.NewLine);
            }
            return output.ToString();
        }

 

一百萬

public void TestMethod1()
        {
            var r1 = SimpleTest(1000000, 5, ShowMsg, ShowMsgWithConst);
            var r2 = SimpleTest(1000000, 10, ShowMsg, ShowMsgWithConst);
            var r3 = SimpleTest(1000000, 20, ShowMsg, ShowMsgWithConst);

            Console.WriteLine("Average over 5" + Environment.NewLine + r1);
            Console.WriteLine("Average over 10" + Environment.NewLine + r2);
            Console.WriteLine("Average over 20" + Environment.NewLine + r3);
        }

一千萬

現在我宣告多一點變數(從 1 變 4),看看是否有更明顯差異

private void ShowMsg()
        {
            string content = "ricoisme";
            string contentb = "ricoisme";
            string contentc = "ricoisme";
            string contentd = "ricoisme";
            //Console.WriteLine(content);
        }

        private void ShowMsgWithConst()
        {
            const string content = "ricoisme";
            const string contentb = "ricoisme";
            const string contentc = "ricoisme";
            const string contentd = "ricoisme";
            //Console.WriteLine(content);
        }

 

一百萬

一千萬

 

結論:

雖然更多變數對效能有一丁點影響,但我覺得奈米等級差異應該可以忽略,

為了可讀性,加上const可以讓人更清楚明瞭。