你可能跟我一樣,平常寫 C# 時看到 const 跟 readonly 常常覺得
const , readonly 不是差不多嗎? 甚至常常忘記 const 這關鍵字...
最近看到一篇文章上面寫說這兩個會造成程式上的拖慢速度,雖然我覺得有一點點誇張
其實之前就有一個印象 const 是編譯期常數,readonly 是執行期不能去動他
但是想想如果會設成 readonly 或是 const 可能都是高頻繁的交易,今天我們來測試看看
這裡面我跑五次比對,都用 stopwatch 計時,每一次都跑 5E 個 double 相加
private const double ConstValue = 123.456;
private static readonly double ReadonlyValue = 123.456;
async static Task Main()
{
const int loops = 500_000_000;
for (var count = 1; count <= 5; count++)
{
Console.WriteLine("第 " + count + " 次測試");
// --- 測 const ---
var sw1 = Stopwatch.StartNew();
double total1 = 0;
for (int i = 0; i < loops; i++)
{
total1 += ConstValue;
}
sw1.Stop();
Console.WriteLine("Const 耗時:" + sw1.ElapsedMilliseconds + " ms");
// --- 測 readonly ---
var sw2 = Stopwatch.StartNew();
double total2 = 0;
for (int i = 0; i < loops; i++)
{
total2 += ReadonlyValue;
}
sw2.Stop();
Console.WriteLine("Readonly 耗時:" + sw2.ElapsedMilliseconds + " ms");
Console.WriteLine("避免被最佳化輸出: " + total1 + "," + total2);
Console.WriteLine("--");
}
}
測試結果:
第 1 次測試
Const 耗時:2308 ms
Readonly 耗時:3143 ms
避免被最佳化輸出: 61728000428.388565,61728000428.388565
--
第 2 次測試
Const 耗時:2210 ms
Readonly 耗時:3136 ms
避免被最佳化輸出: 61728000428.388565,61728000428.388565
--
第 3 次測試
Const 耗時:2269 ms
Readonly 耗時:2948 ms
避免被最佳化輸出: 61728000428.388565,61728000428.388565
--
第 4 次測試
Const 耗時:2088 ms
Readonly 耗時:2992 ms
避免被最佳化輸出: 61728000428.388565,61728000428.388565
--
第 5 次測試
Const 耗時:2186 ms
Readonly 耗時:2940 ms
避免被最佳化輸出: 61728000428.388565,61728000428.388565
其實我也不意外,會有差距,但是請注意,如果你的變數如果是 decimal 或是 物件這就不一定了
const 不一定會比較快,這點我有測試過,就不放上來了
這邊是 MSIL下面的比較圖

結論 -
如果你在高頻迴圈裡面放了 readonly,效能真的會有明顯差異,能 const 就 const,真的不能 const 的就在採用 readonly
或是其他手段..