社区
C#
帖子详情
c# stringbulider拼接字符串性能问题 太差了~
windstore
2010-01-09 06:17:51
我目前要实现批量插入数据库功能,所以采取的方法是,拼3000条然后插入库。用的stringbuilder,但是性能依然很差。插10万条记录居然要1个小时。怀疑是数据库的问题,然后把与数据库交互的代码去掉,只拼接字符串,依然很慢,才发现是用stringbulider拼接字符串耗时。 我想可能是内存占用过多了。
请问像这种大批量拼接数据库插入字符串的话,应该怎么做?用stringbuilder还慢,实在没辙了。。
...全文
862
57
打赏
收藏
c# stringbulider拼接字符串性能问题 太差了~
我目前要实现批量插入数据库功能,所以采取的方法是,拼3000条然后插入库。用的stringbuilder,但是性能依然很差。插10万条记录居然要1个小时。怀疑是数据库的问题,然后把与数据库交互的代码去掉,只拼接字符串,依然很慢,才发现是用stringbulider拼接字符串耗时。 我想可能是内存占用过多了。 请问像这种大批量拼接数据库插入字符串的话,应该怎么做?用stringbuilder还慢,实在没辙了。。
复制链接
扫一扫
分享
举报
写回复
配置赞助广告
用AI写文章
57 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
绿色夹克衫
2010-01-14
打赏
举报
回复
不知道TextBox tbResult这个参数有什么用,没用最好去掉。
LZ先试试这样是否也慢!
protected void MakeInsertSqlString(SMSEntity entity, TextBox tbResult)
{
sb.Append("Insert into ");
// sb.Append(entity.TableName);
sb.Append(" (linkid,mob,destmob,CONTENT,recvtime) Values ('");
// sb.Append(entity.linkid);
sb.Append("','");
// sb.Append(entity.mob);
sb.Append("','");
// sb.Append(entity.destmob);
sb.Append("','");
// sb.Append(entity.content);
sb.Append("','");
// sb.Append(entity.recvtime);
sb.Append("');");
count++;
}
[Quote=引用 55 楼 windstore 的回复:]
关键的性能问题就是在:MakeInsertSqlString 这个方法了。。
也许只能采用把sql写到.sql文件,然后执行了。。
[/Quote]
绿色夹克衫
2010-01-14
打赏
举报
回复
LZ应该再试试楼上提供的测试stringbulider性能的程序,看是否同样很慢。
也许是机器本身的什么问题!有什么输出操作或者控件Text赋值的地方,也会导致变慢。
别太武断的认为是stringbulider的问题,LS几位测试的数据远远高于10万量级,而执行效率都是秒级的,
应该说stringbulider的效率是很高的。应该逐句找到效率的瓶颈再做优化。
[Quote=引用 54 楼 windstore 的回复:]
谢谢大家的关注。。
其实我测试的时候特意把插入数据库的语句注释掉了,也就是说在没有和数据库交互的情况下就很慢了。但是如果我把用stringbulider拼接sql的方法也注释掉,就很快了。。所以问题还是在用这个stringbulider的问题
[/Quote]
windstore
2010-01-14
打赏
举报
回复
关键的性能问题就是在:MakeInsertSqlString 这个方法了。。
也许只能采用把sql写到.sql文件,然后执行了。。
windstore
2010-01-14
打赏
举报
回复
谢谢大家的关注。。
其实我测试的时候特意把插入数据库的语句注释掉了,也就是说在没有和数据库交互的情况下就很慢了。但是如果我把用stringbulider拼接sql的方法也注释掉,就很快了。。所以问题还是在用这个stringbulider的问题
zhoujk
2010-01-11
打赏
举报
回复
一条一条的插入可能比拼接3000条然后一次性写入的效率要高,String 的操作是很慢的
编程有钱人了
2010-01-11
打赏
举报
回复
这么大的数据操作就不能考虑用StringBuilder对象了
直接用list<string> 都比上面的好
zuoming120
2010-01-11
打赏
举报
回复
[Quote=引用 51 楼 guyehanxinlei 的回复:]
这么大的数据操作就不能考虑用StringBuilder对象了.使用存储过程,批量语句执行等等.
[/Quote]
d
guyehanxinlei
2010-01-11
打赏
举报
回复
这么大的数据操作就不能考虑用StringBuilder对象了.使用存储过程,批量语句执行等等.
mbh0210
2010-01-11
打赏
举报
回复
你这个不是stringbulider性能的问题
而是网数据库插入数据比较慢,
尽量避免多次大开关闭数据库。
polarissky
2010-01-11
打赏
举报
回复
[Quote=引用 31 楼 sdfkfkd 的回复:]
楼主使用
db.ExecuteNonQuery(sb.ToString());
来执行,应该是封装的方法,估计是SQLHELP吧
象这种大批量更新数据库
1、共用一个连接,避免每次打开关闭连接
2、启动事务
3、尽量一次执行多条语句,这点楼主做了
楼主可以再多贴些代码上来
[/Quote]
我赞同这个观点。
共用一个数据连接,构造一条语句,执行一次SQL语句。我也弄个过和楼主类似的东西,最多往数据库写入5000多条记录,耗时不到2秒。
huming_h
2010-01-11
打赏
举报
回复
每当使用StringBuilder 的时候都是
StringBuilder sb=new StringBuilder ();
感觉有点汗。。。。
gbb21
2010-01-11
打赏
举报
回复
[Quote=引用 41 楼 psps001 的回复:]
微软的整个.NET,本身就是一个性能较差的架构,只有等微软如优化了,特别是桌面程序的开发,几乎没有那个企业敢用!!
[/Quote]
哈哈哈哈哈哈哈
huangzhe10
2010-01-10
打赏
举报
回复
StringBuilder比string性能好多了吧!!
skyaspnet
2010-01-10
打赏
举报
回复
private StringBuilder sb = new StringBuilder(SBCAPACITY);
这句改成
private static StringBuilder sb = new StringBuilder(SBCAPACITY);
试一下
skyaspnet
2010-01-10
打赏
举报
回复
基本上可以肯定不是stringbuilder的问题, 测试过20000000条字符连接, 不到十秒,
还是数据库操作部分的代码需要改进, 可以把数据库部分的代码贴出来看一下
flyerwing
2010-01-10
打赏
举报
回复
stringbuilder比string拼节性能好的不只是一点点
可以做程序验证下!!!
内存省的不只是一点点
leafold
2010-01-10
打赏
举报
回复
字符串前面加@""
leafold
2010-01-10
打赏
举报
回复
写到脚本文件MyScript.sql中
如果数据库采用信任链接:
Process.Start("sqlcmd -E -i -S server_name C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt");
否则
Process.Start("sqlcmd -U login_id -P password -i -S server_name C:\MyFolder\MyScript.sql -o C:\MyFolder\MyOutput.txt");
mjp1234airen4385
2010-01-10
打赏
举报
回复
建议:把你的文件按照数据库需要的格式,写成一个文件。让数据库去处理,还是很快的。
Thr21ough
2010-01-10
打赏
举报
回复
up~
加载更多回复(37)
C#
字符串
拼接
性能
陷阱:为什么
String
Builder不一定比+快?
小规模
拼接
:如果
拼接
的
字符串
数量较少,运算符通常更高效,原因在于它可能会被编译器优化为单一的
拼接
操作,并且的初始化开销会抵消
性能
提升。大规模
拼接
:如果需要
拼接
大量的
字符串
,通常会比运算符更高效,特别是在循环中。避免了每次
拼接
都生成新的
字符串
对象的
性能
损失。预设容量:使用时,适当设置初始容量可以避免频繁的内存扩展,提升
性能
。常量
字符串
拼接
:如果
拼接
的
字符串
是常量,运算符可能更优,因为编译器能够在编译时直接合并它们。总之,选择正确的
字符串
拼接
方式需要根据实际需求和
拼接
规模来决定。对于小规模
拼接
,
C#
中的
String
Bulider
C#
中的
String
Bulider
提到
String
Builder,就不得不说.Net中的
String
类,该类是
C#
中的基本数据类型,并且是唯一一个引用类型的基本数据类型。但
String
类的对象是”不可修改的“!这里说的不可修改并非是对象的值不可修改,而是
String
类中的
字符串
在声明时就被当成是常量,修改它的值只是另外声明一个常量,并将其指针指向新声明的常量的地址。关于
String
类,大家可以看看这
C#
--
字符串
操作
字符串
String
和
String
Bulider
性能
比较
写段相同的代码测试一下两者的
性能
,看两者各自的用时分别是多长时间: 第一段: public static void User
String
() {
string
@
string
= ""; DateTime startTime = DateTime.Now; for (int i = 0; i < 10000; i++) { ...
C#
之
String
Bulider
简单用法
String
Build的是个动态对象,可直接拼加上
字符串
;而
string
对象的步骤:先初始化对象并赋值了,而后在拼加
字符串
时,先要创建需要拼加的
字符串
,然后再拼加,所以这就是StirngBuild远比
String
效率高的原因! (一)
String
对象是不可改变的。每次使用 System.
String
类中的方法之一时,都要在内存中创建一个新的
字符串
对象,这就需要为该新对...
C#
111,128
社区成员
642,536
社区内容
发帖
与我相关
我的任务
C#
.NET技术 C#
复制链接
扫一扫
分享
社区描述
.NET技术 C#
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
让您成为最强悍的C#开发者
试试用AI创作助手写篇文章吧
+ 用AI写文章