2014-01-18 28 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是一个随机字符串,但我明白你的意思 - 无论如何,这样做对于编译器来说看起来都是一样的。 –