[C#] const vs readonly 到底差多少?Stopwatch 實測給你看

2025-06-18

你可能跟我一樣,平常寫 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 

或是其他手段..




當麻許的碎念筆記 2014 | Donma Hsu Design.