StringBuilder的性能在少量追加

时间:2013-10-04 10:33:53

标签: c# asp.net string stringbuilder

 public DataTable dt_date(resbal obj)
{
    connection();

    string details = @"SELECT donor_contacts.name AS NAME, m_reserve_userdetails.res_no AS 'RESERVATION NO',
    m_room_user.build AS 'BUILDING',m_room.roomno AS 'ROOM NO',DATE_FORMAT(intime,'%r') AS 'CHECK-IN TIME',
    CASE WHEN m_room_user.rent =0 THEN 'Free'  ELSE 'Pass' END AS 'Passtype' FROM  m_reserve_userdetails,donor_contacts,m_room_user,m_room
    WHERE m_reserve_userdetails.id = donor_contacts.id 
    AND  m_room_user.donor_id = m_reserve_userdetails.user_id    
    AND m_reserve_userdetails.status=1 
    AND indate ='" + obj.date + "'";


    OdbcCommand cmd = new OdbcCommand(details, con);
    OdbcDataAdapter oda = new OdbcDataAdapter(cmd);
    DataTable dt = new DataTable();
    oda.Fill(dt);
    return dt;
}

OR

public DataTable dt_date(resbal obj) {     连接();

StringBuilder datails = new StringBuilder();
datails.Append("SELECT donor_contacts.name AS NAME, ");
datails.Append("m_reserve_userdetails.res_no AS 'RESERVATION NO',");
datails.Append("m_room_user.build AS 'BUILDING',");
datails.Append("m_room.roomno AS 'ROOM NO',");
datails.Append("DATE_FORMAT(intime,'%r') AS 'CHECK-IN TIME',");
datails.Append("CASE WHEN m_room_user.rent =0 THEN 'Free'  ");
datails.Append("ELSE 'Pass' END AS 'Passtype' FROM  m_reserve_userdetails,");
datails.Append("donor_contacts,m_room_user,m_room");
datails.Append("WHERE m_reserve_userdetails.id = donor_contacts.id");
datails.Append("AND  m_room_user.donor_id = m_reserve_userdetails.user_id");
datails.Append("AND m_reserve_userdetails.status=1");
datails.Append("AND indate ='" + obj.date + "'");

OdbcCommand cmd = new OdbcCommand(datails.ToString(), con);
OdbcDataAdapter oda = new OdbcDataAdapter(cmd);
DataTable dt = new DataTable();
oda.Fill(dt);
return dt;

}

我想知道,即使只有8或10个追加,stringBuilder也能比string更好吗?我在上面添加了一个关于此的查询。但我发现没有显着差异。此查询需要时间。我知道,最有可能它需要查询优化。但现在,我需要知道使用stringBuilder有什么进展,而只有8到10个附加。提前谢谢。

5 个答案:

答案 0 :(得分:2)

当在编译时固定要连接的字符串数时,正常连接总是表现得更好。另外,在你的第一个例子中,连接的字符串要少得多。

我不知道有任何支持StringBuilder的论点。非常明确的案例。

请注意,第一个代码段中的第一个字符串文字只是一个多行文字。无论如何,这里没有连接。此外,编译器会将"a" + "b"优化为"ab"

答案 1 :(得分:2)

在我看来,这个案例没有性能问题。

String 不可变StringBuilder 可变。如果你想很多字符串连接,StringBuilder当然更好。

但我看到这里只有12个连接,我认为它们不会产生巨大的性能差异。

看一下Jeff的文章The Sad Tragedy of Micro-Optimization Theater

编辑:是的,我完全错过了非参数化查询。

您应该始终使用 parameterized queries 来代替这种字符串连接。因为这些攻击是针对 SQL Injection 攻击开放的。

答案 2 :(得分:2)

都不是。您应该使用参数化查询。这是保护自己免受SQL注入攻击的最佳做法。

如果您仍想将值连接到字符串中,则没有理由使用StringBuilder。如果没有StringBuilder,连接已知数量的字符串会更好,因为文字字符串实际上会被编译器连接起来,而不是在运行时连接。

我注意到你甚至没有使用StringBuilder将值放入字符串中,但首先将值连接成字符串,然后将其发送到StringBuilder。如果您使用StringBuilder将值放入字符串中,那么该值将自行调用Append

答案 3 :(得分:1)

从表现来看,这是:

private const string details = "SELECT ... AND indate = '{0}'";

string.Format(details, obj.date);
在你的情况下,

肯定比StringBuilder或甚至字符串连接更好(但是为了格式化你的字符串需要一些修改,你还需要一台显微镜才能看到差异)。

从常识来看,SQL查询的字符串连接是一种地狱的方式。使用参数化查询:

private const string details = "SELECT ... AND indate = @indate";

答案 4 :(得分:0)

你的场景中的正确答案是“不”我害怕......你使用字符串串联来执行SQL命令,这是每次都很糟糕的事情。你应该做的是使用带参数的过程或查询。在这两种方法中,您都不需要连接。

如果我忽略了你将它用于SQL的事实,那么我使用的是经验法则:如果你将字符串连接多次,例如在循环中,使用StringBuilder。在其他情况下使用简单连接。