2014-01-18 31 views
1

我最近發現我的表現幫助的工具,我上的Visual Studio 2013使用的任何時候,我做一個複雜的字符串vb.net格式化爲高性能

爲樣本字符串:

"SELECT * from calls where randid = '" & randid & "'" 

它會而是建議使用字符串格式

String.Format("SELECT * from calls where randid = '{0}'", randid) 

相同的使用值初始化 而不是

 Dim cb As New MySqlConnectionStringBuilder 
     cb.Database = dbfile 
     cb.Server = dbserver 
     cb.UserID = dbuser 
     cb.Password = dbpassw 

使用

Dim cb As New MySqlConnectionStringBuilder() With {.Database = dbfile, .Server = dbserver, .UserID = dbuser, .Password = dbpassw} 

難道這些格式實際上提高應用程序的性能,或者是推薦這些美學?

+0

您的應用程序中是否存在性能問題?分析告訴你這是在字符串格式化調用?您是否嘗試實施兩種方法並測量哪種方法更快?如果不是,它似乎並不重要。 – millimoose

+5

另外,您不應該使用 - 參數插值更安全。 – millimoose

+2

如果你不打算使用參數化查詢你的整個Db處於危險之中。 – OneFineDay

回答

1

出於好奇,(我絕對相信,迷你優化是魔鬼)我一直在使用LinqPad測試與驗證碼的區別:

Sub Main 
    Dim test = "999" 
    Dim sw = new Stopwatch() 
    sw.Start() 
    for i = 0 to 100000 
     Dim s = "SELECT * FROM TABLE WHERE FIELD = '" + test + "'" 
    Next 
    sw.Stop() 
    sw.Elapsed.Dump("Concat") 

    sw = new Stopwatch() 
    sw.Start() 
    for i = 0 to 100000 
     Dim s = string.Format("SELECT * FROM TABLE WHERE FIELD = '{0}'", test) 
    Next 
    sw.Stop() 
    sw.Elapsed.Dump("Format") 
End Sub 

與這些結果:

Concat 
00:00:00.0101903 

Format 
00:00:00.0365234 

輸出如果我們使用整數作爲測試變量,則顯着變化,因爲現在串聯應該使用ToString()

Dim test = 999 

Concat 
00:00:00.0198107 

Format 
00:00:00.0485193 

因此,無論出於何種原因,您的工具建議使用string.Format方法,它不會獲得更好的性能。

1

在第一個編譯器將生成String.Concat方法調用您的字符串連接:

return "test" + value + "test"; 

它翻譯成

IL_0000: ldstr "test" 
IL_0005: ldarg.0 
IL_0006: box [mscorlib]System.Int32 
IL_000b: ldstr "test" 
IL_0010: call string [mscorlib]System.String::Concat(object, object, object) 
IL_0015: ret 

兩個String.ConcatString.Format會造成拳擊(我假定randidint )。無論如何,您應該撥打ToString()以使其更好。

第二個是外行。編譯器將反正生成屬性分配,所以

Dim cb As New MySqlConnectionStringBuilder() With {.Database = dbfile, .Server = dbserver, .UserID = dbuser, .Password = dbpassw} 

由編譯器變換爲

Dim cb As New MySqlConnectionStringBuilder 
cb.Database = dbfile 
cb.Server = dbserver 
cb.UserID = dbuser 
cb.Password = dbpassw 

+0

在這個特定情況下,randid是一個隨機字符串,但我明白你的意思 - 無論如何,這樣做對於編譯器來說看起來都是一樣的。 –