最近幾次被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可以讓人更清楚明瞭。