在重复对字符串进行修改操作下,不是StringBulider比String更有优势吗,怎么会我用以下的代码利用运行时间差进行测试,得到的却是相反的结果呢??难道占用内存与运行时间是熊掌跟鱼的关系!! 为什么??
几组结果: StringBuilder String 1) 0.2203168 0.1301872 2) 0.2303312 0.1301872
3) 0.2203168 0.1402016 StringBuilder b = new StringBuilder("hello");
DateTime T3 = System.DateTime.Now;
for (int i = 0; i < 20; i++)
{
b.Append(b);
}
TimeSpan Ts2 = System.DateTime.Now - T3;
Console.WriteLine(Ts2.TotalSeconds.ToString());
string a = "hello";
DateTime T1 = System.DateTime.Now;
for (int i = 0; i < 20; i++)
{
a += a;
}
TimeSpan Ts1 = System.DateTime.Now - T1;
Console.WriteLine(Ts1.TotalSeconds.ToString());
几组结果: StringBuilder String 1) 0.2203168 0.1301872 2) 0.2303312 0.1301872
3) 0.2203168 0.1402016 StringBuilder b = new StringBuilder("hello");
DateTime T3 = System.DateTime.Now;
for (int i = 0; i < 20; i++)
{
b.Append(b);
}
TimeSpan Ts2 = System.DateTime.Now - T3;
Console.WriteLine(Ts2.TotalSeconds.ToString());
string a = "hello";
DateTime T1 = System.DateTime.Now;
for (int i = 0; i < 20; i++)
{
a += a;
}
TimeSpan Ts1 = System.DateTime.Now - T1;
Console.WriteLine(Ts1.TotalSeconds.ToString());
解决方案 »
- UpdateCommand 怎么写?
- 搞WinForm的有什么技术应该好好学习的??
- 多态问题!
- 最头痛的Java与.Net集成的问题(Java Corba)
- 如何获得datagrid中的行数和列数??
- C#中socket通信传输大数据问题
- 关于线程对象 Abort 方法调用以后~这个对象还存不存在?
- 在centos下安装oracle9i,SDO_GEOMETRY不能识别
- 模仿QQ实现在屏幕边缘隐藏的功能,但是出现了一点小问题!
- 读取一个字符串时,遇到空格就让他转到下一行。怎么写?
- 如何通過一個公用的函數實現Delegate TextClickEvent =new System.EventHandler(this.button3_Click)
- 如何使lable中的字符可以被选中
2、b.Append(b);//你这里b是StringBuilder类型的,所以会有一个ToString的调用,显然在循环中这是很影响效率的。
这样 你这样测下
1 StringBuilder b = new StringBuilder("hello"); //这句刨除在测试之外,再对比下结果
2.StringBuilder b=new StringBuilder(); b.Append("hello");//改成这样再测测
3.b.Append("hello"); a+="hello";//这样再测测
//123 可混合测试
0.09375
0.0625把Append的参数改为字符串"hello"
则是
0
0.0625
StringBuilder b = new StringBuilder("hello");
DateTime T3 = System.DateTime.Now;
for (int i = 0; i < 20000; i++)
{
b.Append("0");
}
TimeSpan Ts2 = System.DateTime.Now - T3;
richTextBox1.Text = Ts2.TotalSeconds.ToString();
string a = "hello";
DateTime T1 = System.DateTime.Now;
for (int i = 0; i < 20000; i++)
{
a += "0";
}
TimeSpan Ts1 = System.DateTime.Now - T1;
richTextBox1.Text += "\n" + Ts1.TotalSeconds.ToString();
执行结果是
0
0.296875你的程序是把自身在复制,主要是在测试机器的性能,而不是你想要的目的
不过这与楼主的要求不符了
第二种情况,这个解析倒是赞同;不知还有其他的解析没。。另外,还想问下,StringBulider相对于string来说,优势只体现在占用内存少,以及修改频繁时(ps:起码>20 ^_^),还有处理时间少的好处呢
效率最高的方法应该是用char数组
用Buffer.BlockCopy复制或者用Unsafe代码,用int型指针
StringBuilder b = new StringBuilder( s );
watch.Start();
for ( int i = 0; i < 2000; i++ )
{
b.Append( s );//这里避免ToString损耗
}
watch.Stop();
Console.WriteLine( watch.ElapsedMilliseconds ); string a = s;
watch.Start();
for ( int i = 0; i < 2000; i++ )
{
a += s;//这里不能用a+=a,否则会造成19+18+...+1个hello相加。
}
watch.Stop();
Console.WriteLine( watch.ElapsedMilliseconds ); Console.Read();
在循环200次以下根本没法比较结果,在循环2000次开始有差异,StringBuilder所耗费的时间始终是0,而+=耗费的时间随着循环的次数急剧上升。
虽然两个都可以简称SB,但是含义不一样了
我感觉StringBulider就是个字符串缓冲区~
b.Append(b)是2的50次方,你可以计算一下这个字节有多大,再加上基数是5个字节,当然内存就不够了
虽然两个都可以简称SB,但是含义不一样了
我感觉StringBulider就是个字符串缓冲区~
================================================================比较一下Builder系的类和Buffer系的类:StringBuilder、UriBuilder
BufferedStream
StringBuilder用处更多的还是在于构建(Builder),至于缓存(Buffer)只是构建时采取的提高效率的方法,这样的命名是合理的。
虽然 StringBuilder 对象是动态对象,允许扩充它所封装的字符串中字符的数量,但是您可以为它可容纳的最大字符数指定一个值。此值称为该对象的容量,不应将它与当前 StringBuilder 对象容纳的字符串长度混淆在一起。例如,可以创建 StringBuilder 类的带有字符串“Hello”(长度为 5)的一个新实例,同时可以指定该对象的最大容量为 25。当修改 StringBuilder
我用赛扬1.7+256DDR+15球面开发了整个大学...
为什么看见楼上有出来8的?
为什么看见楼上有出来8的?
==================================================================是我计算错误……