C#編譯器對局部變量的優(yōu)化指南
前言
C# 的編譯器可以對代碼進行優(yōu)化,所以,我們在寫代碼的時候,可以更多地考慮一下代碼的易讀性問題。
不考慮基本的對齊和換行美化。看一下局部變量優(yōu)化問題。
C# 示例代碼
例如,我們有一段如下的代碼:
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApp1 { class Program { static void Main(string[] args) { var s = DoSomething(); Console.WriteLine(s); } static string DoSomething() { var s1 = "Hello, world."; var s2 = s1.ToUpper(); return s2; } } }
在 DoSomething() 這個方法中,里面定義了兩個局部變量:
- s1
- s2
在 Main() 方法中,定義了一個局部變量:
- s
定義 s1 和 s2 是為了提高代碼的可讀性,它們會導(dǎo)致生成冗余的代碼,降低執(zhí)行效率嗎?
我們分別在 Debug 模式下和 Release 模式下進行編譯,使用 ILDasm 查看生成的中間代碼。
Debug 模式下生成的中間代碼
在 Debug 下編譯之后,DoSomething() 生成的中間代碼如下,可以看到實際上有 3 個局部變量。除了我們自己定義的 s1 和 s2 之外,還有一個生成的 V_2,代碼的尺寸為 20。
.method private hidebysig static string DoSomething() cil managed { // Code size 20 (0x14) .maxstack 1 .locals init ([0] string s1, [1] string s2, [2] string V_2) IL_0000: nop IL_0001: ldstr "Hello, world." IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: callvirt instance string [mscorlib]System.String::ToUpper() IL_000d: stloc.1 IL_000e: ldloc.1 IL_000f: stloc.2 IL_0010: br.s IL_0012 IL_0012: ldloc.2 IL_0013: ret } // end of method Program::DoSomething
看一下 Main() 方法。
有我們定義的 s 這一個局部變量,代碼尺寸為 15 個字節(jié)。
.method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 15 (0xf) .maxstack 1 .locals init ([0] string s) IL_0000: nop IL_0001: call string ConsoleApp1.Program::DoSomething() IL_0006: stloc.0 IL_0007: ldloc.0 IL_0008: call void [mscorlib]System.Console::WriteLine(string) IL_000d: nop IL_000e: ret } // end of method Program::Main
Release 模式下生成的中間代碼
而在 Release 模式下,實際上,DoSomething() 中所有的局部變量都被優(yōu)化掉了。代碼尺寸也只有 11 個字節(jié)。
.method private hidebysig static string DoSomething() cil managed { // Code size 11 (0xb) .maxstack 8 IL_0000: ldstr "Hello, world." IL_0005: callvirt instance string [mscorlib]System.String::ToUpper() IL_000a: ret } // end of method Program::DoSomething
還可以看一下 Main() 方法,這個局部變量 s 也被優(yōu)化掉了。代碼尺寸也只有 11 字節(jié)了。
.method private hidebysig static void Main(string[] args) cil managed { .entrypoint // Code size 11 (0xb) .maxstack 8 IL_0000: call string ConsoleApp1.Program::DoSomething() IL_0005: call void [mscorlib]System.Console::WriteLine(string) IL_000a: ret } // end of method Program::Main
結(jié)論
編譯器會盡可能對代碼進行優(yōu)化,我們可以為了提高代碼的易讀性增加一些局部變量,這并不會導(dǎo)致生成冗余代碼并導(dǎo)致執(zhí)行性能的下降。
到此這篇關(guān)于C#編譯器對局部變量優(yōu)化的文章就介紹到這了,更多相關(guān)C#編譯器對局部變量優(yōu)化內(nèi)容請搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
C#實現(xiàn)復(fù)制數(shù)據(jù)庫 C#將A數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)到B數(shù)據(jù)庫
這篇文章主要為大家詳細介紹了C#復(fù)制數(shù)據(jù)庫,將數(shù)據(jù)庫數(shù)據(jù)轉(zhuǎn)到另一個數(shù)據(jù)庫,具有一定的參考價值,感興趣的小伙伴們可以參考一下2017-11-11C#中泛型容器Stack<T>的用法并實現(xiàn)”撤銷/重做”功能
這篇文章介紹了C#中泛型容器Stack<T>的用法并實現(xiàn)”撤銷/重做”功能,文中通過示例代碼介紹的非常詳細。對大家的學(xué)習(xí)或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-10-10c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)
c# StringBuilder.Replace 方法 (Char, Char, Int32, Int32)...2007-08-08C#調(diào)用OpenCV開發(fā)簡易版美圖工具【推薦】
本文主要介紹在WPF項目中使用OpenCVSharp3-AnyCPU開源類庫處理圖片,本文通過實例代碼給大家介紹的非常詳細,具有一定的參考借鑒價值,需要的朋友參考下吧2019-10-10運用示例簡單講解C#取消令牌CancellationTokenSource
這篇文章運用示例簡單講解C#取消令牌CancellationTokenSource,文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2021-08-08