[C#] 一個無聊的冷知識關於已知運算常數編譯後的MSIL

2023-02-06


寫一個有趣的小東西,大概算是 C# 冷知識,大概就跟台灣本島最北的國際機場是桃園中正機場而不是松山機場一樣冷知識

今天好奇問同事一個問題 假設我要 1+2+3+...+100 這答案

1. 我手動打 return 1+2+3+4+5+...+100; 

2. 我用迴圈  for (var i = 1; i <= 100; i++) 最後 return sum; 

3. 用梯形公式解  return ((1+100)*100)/2 

這三個到底 哪一個執行比較快


第二個會是最慢的應該是大家的共識,我的編譯器是 .NET 6


但是第三個跟第一個有爭論,有人說第三個會快點,我是贊成應該是差不多,原因是 現在 compiler 很聰明,這種應該會變成常數回傳

之後我就簡單寫了一個程式測試一下

並且透過 JetBrains dotPeek 看一下 MSIL CODE:


FuncA  (1 +2+3+4+...+100)

C# Code:

MSIL:


FuncC (梯形公式)

C# Code:

MSIL:


直接說重點

FuncA: IL_0001: ldc.i4       5050 // 0x000013ba

FuncC :IL_0001: ldc.i4       5050 // 0x000013ba


所以編譯器其實很聰明的直接算好當作常數回傳。

理論上值行會一樣快,冷知識阿


當麻許的超技八 2014 | Donma Hsu Design.