Dot-Net

VB.NET 是否優化了字元串文字的連接?

  • June 10, 2012

類似於這個問題,但是對於 VB.NET,因為我學會了這是一個語言的東西。

例如,編譯器是否知道翻譯

Dim s As String = “test” + “this” + “function”

Dim s As String = "test this function"

從而避免字元串連接對性能的影響?

是的。它確實。我只測試了 VS 2008,但我強烈懷疑以前的版本也是如此。

VB.NET

Public Class Class1


   Dim s As String = "test " + "this " + "function"

   Public Function test() As String
       Return s
   End Function

End Class

IL - 注意字元串“test this function”

{
   .maxstack 8
   L_0000: ldarg.0 
   L_0001: call instance void [mscorlib]System.Object::.ctor()
   L_0006: nop 
   L_0007: ldarg.0 
   L_0008: ldstr "test this function"
   L_000d: stfld string ClassLibrary1.Class1::s
   L_0012: nop 
   L_0013: ret 
}

是的,它確實!讓我們來測試一下。

由於 .NET 將所有託管語言(VB、C#、C++)編譯為 IL(中間語言)指令,並且String類型是 CLS(公共語言規範)的一部分,所有 .NET Framework 版本:String2.0、3.0、3.5、4.0 將文字連接優化為編譯過程的一部分。

例如下面的 VB.NET 程式碼:

Dim s As String = "A" & "B" & "C" 

產生以下 IL 指令:

L_0008: ldstr "ABC"

這清楚地證明了編譯器正在優化String文字連接(在:ildasm.exe 中測試)

但是,如果上面的程式碼是用單獨的語句編寫的:

Dim s As String = "A"
s &= "B"
s &= "C" 

沒有進行優化並且String在執行時執行連接(性能成本)。這同樣適用於在執行時解析數據的單行語句(變數、屬性、方法)。

使用下劃線 _ 將上述語句連接成單個語句以強制優化:

Dim s As String = "A" _
& "B" _
& "C" _

如果您需要在標記之間換行,請使用vbCrLf(compile-time) 常量來確保優化,因為 using Environment.NewLine(run-time) 屬性不提供優化。

希望這可以幫助您獲得性能優勢!

引用自:https://stackoverflow.com/questions/290527