关于C#的性能问题一:很奇怪的 for循环,求解释

andyqq8 2011-05-27 05:45:33
 
代码:
string str =string.Empty;
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000 * 10000; i += 1)
{
str = "a"; ;
}
watch.Stop();
textBox1.Text += ("用时:" + watch.ElapsedMilliseconds.ToString() + "毫秒\r\n");

结果:
用时:386毫秒


 
代码:
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000 * 10000; i += 1)
{
string str = "a"; ;
}
watch.Stop();
textBox1.Text += ("用时:" + watch.ElapsedMilliseconds.ToString() + "毫秒\r\n");

结果:
用时:431毫秒

 
代码:
for (int x = 0; x < 2; x++)
{
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000 * 10000; i += 1)
{
string str = "a"; ;
}
watch.Stop();
textBox1.Text += ("用时:" + watch.ElapsedMilliseconds.ToString() + "毫秒\r\n");
}

结果:
用时:393毫秒
用时:393毫秒


 
代码:
for (int xx = 0; xx < 2; xx++)
{
for (int x = 0; x < 2; x++)
{
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000 * 10000; i += 1)
{
string str = "a"; ;
}
watch.Stop();
textBox1.Text += ("用时:" + watch.ElapsedMilliseconds.ToString() + "毫秒\r\n");
}
}

结果:
用时:431毫秒
用时:431毫秒
用时:431毫秒
用时:432毫秒


 
代码:
for (int xxx = 0; xxx < 2; xxx++)
{
for (int xx = 0; xx < 2; xx++)
{
for (int x = 0; x < 2; x++)
{
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000 * 10000; i += 1)
{
string str = "a"; ;
}
watch.Stop();
textBox1.Text += ("用时:" + watch.ElapsedMilliseconds.ToString() + "毫秒\r\n");
}
}
}

结果:
用时:389毫秒
用时:396毫秒
用时:392毫秒
用时:390毫秒
用时:389毫秒
用时:390毫秒
用时:389毫秒
用时:391毫秒




这个性能和循环数量好像无关,但和奇偶有关呀????这是为什么呀
...全文
2640 93 打赏 收藏 转发到动态 举报
写回复
用AI写文章
93 条回复
切换为时间正序
请发表友善的回复…
发表回复
zlntang 2011-06-02
  • 打赏
  • 举报
回复
居然有这种事情。。
qs99521 2011-06-02
  • 打赏
  • 举报
回复
Stopwatch watch = new Stopwatch();
watch.Start();
for (int i = 0; i < 10000 * 10000; i += 1)
{
string str = "a"; ;
}
watch.Stop();
textBox1.Text += ("用时:" + watch.ElapsedMilliseconds.ToString() + "毫秒\r\n");
你输出的信心所有都是这个执行等性能。无论你循环几次他的值肯定是相近的。主要还是看你的CPU处理能力。如果你项更明确他的性能问题,建议你把Stopwatch写在所有循环的外层看看。要不你这么循环测同一段代码根本没意义。跟尺子测量同一段距离。你看的数值也是有误差的。
bullet664051094 2011-06-02
  • 打赏
  • 举报
回复
这个跟很多因素有关。
个人感觉跟变量或者对象的生命周期及其编译情况很有关系!
cqyy725 2011-06-02
  • 打赏
  • 举报
回复
你试试用 StringBuilder来拼接字符串看看效果

s361343167 2011-06-02
  • 打赏
  • 举报
回复
[Quote=引用 89 楼 imhm 的回复:]
围观啊 。。。。 。 .NET确实,太仁慈了。。。。。 所谓,.NET性能问题,10有89都是让嫩们这些菜鸟给搞臭名声的 。。。
for (int i = 0; i < 10000 * 10000; i += 1)
{
string str = "a"; ;
}
textBox1.Text += ("用时:" + watch.ElapsedMilliseconds.ToString() ……
[/Quote]


哥们,给个好性能的代码我看看好吗?我最性能这块也不了解
buyong 2011-06-02
  • 打赏
  • 举报
回复
I do not agree with you. I do not think the following code is useless.
[Quote=引用 89 楼 imhm 的回复:]
围观啊 。。。。 。 .NET确实,太仁慈了。。。。。 所谓,.NET性能问题,10有89都是让嫩们这些菜鸟给搞臭名声的 。。。
for (int i = 0; i < 10000 * 10000; i += 1)
{
string str = "a"; ;
}
textBox1.Text += ("用时:" + watch.ElapsedMilliseconds.ToString() ……
[/Quote]
buyong 2011-06-02
  • 打赏
  • 举报
回复
就是这个原因,这相当于你无论有几个循环,实际测试的都是最里面循环的时间!
[Quote=引用 8 楼 chuzhaowei 的回复:]
C# code

代码:
for (int xxx = 0; xxx < 2; xxx++)
{
for (int xx = 0; xx < 2; xx++)
{
for (int x = 0; x < 2; x++)
……
[/Quote]
imhm 2011-06-02
  • 打赏
  • 举报
回复
围观啊 。。。。 。 .NET确实,太仁慈了。。。。。 所谓,.NET性能问题,10有89都是让嫩们这些菜鸟给搞臭名声的 。。。
for (int i = 0; i < 10000 * 10000; i += 1)
{
string str = "a"; ;
}
textBox1.Text += ("用时:" + watch.ElapsedMilliseconds.ToString() + "毫秒\r\n");

类似这2行,垃圾、狗屎一样的写法,编译器,就不应该让其通过,直接掐死丫的 。。。 M¥真是太仁义了。。。
andyqq8 2011-06-02
  • 打赏
  • 举报
回复
用时:447毫秒
用时:376毫秒
用时:381毫秒
用时:377毫秒

用时:451毫秒
用时:375毫秒
用时:379毫秒
用时:379毫秒

用时:453毫秒
用时:378毫秒
用时:378毫秒
用时:378毫秒

用时:455毫秒
用时:378毫秒
用时:381毫秒
用时:380毫秒

用时:448毫秒
用时:379毫秒
用时:379毫秒
用时:377毫秒

用时:452毫秒
用时:381毫秒
用时:377毫秒
用时:377毫秒

用时:444毫秒
用时:381毫秒
用时:377毫秒
用时:379毫秒


我顶楼的结果是debug版的。。。刚经79楼的网友提醒测试了Release版的,多次运行的结果如上(奇偶都没有顶楼的明显差距,所以不重复帖了),这个Release第一遍可能还要编译的原因耗时比较多,没有顶楼的debug版的结果一致性
andyqq8 2011-06-02
  • 打赏
  • 举报
回复
如果有其他进程抢占cpu.结果会如我回帖里的这般一致吗?+- 1的各个结果如果你动过脑子,会存在其他程序抢占cpu的情况吗?鄙视你们!
andyqq8 2011-06-02
  • 打赏
  • 举报
回复
这帖只有一个70楼的同学真正实验了。。。
松林迷途 2011-06-01
  • 打赏
  • 举报
回复
这个为了什么?
duke3030 2011-06-01
  • 打赏
  • 举报
回复
我测试了下(也是测试了多次),如果使用Debug版编译,结果如下:

奇数次for循环
用时:248毫秒
用时:249毫秒
用时:250毫秒
用时:248毫秒

偶数次for循环
用时:253毫秒
用时:256毫秒
用时:256毫秒
用时:251毫秒
用时:254毫秒
用时:255毫秒
用时:257毫秒
用时:256毫秒

Release版编译,结果如下:

奇数次for循环
用时:207毫秒
用时:210毫秒
用时:210毫秒
用时:210毫秒

偶数次for循环
用时:210毫秒
用时:208毫秒
用时:208毫秒
用时:208毫秒
用时:210毫秒
用时:212毫秒
用时:207毫秒
用时:209毫秒

可以看到,release版二者没什么大的区别,各有快慢,应该和for循环的嵌套的奇偶性无关吧
另外,我给楼主的代码各增加了2层嵌套,结果和上面的也没什么大的差异

至于Debug版,我想应该没什么参考价值,谁知道VC在debug时做了什么手脚啊
zetee 2011-06-01
  • 打赏
  • 举报
回复
这个说明,你只会动手,不会动脑
andyqq8 2011-06-01
  • 打赏
  • 举报
回复
[Quote=引用 76 楼 weike021996 的回复:]
受教了啊
[/Quote]

同学,期待高手答疑
chenliuyang 2011-06-01
  • 打赏
  • 举报
回复
这傻帽真让人蛋疼
Ranger_lhq 2011-06-01
  • 打赏
  • 举报
回复
我就纳闷了..
你那里看到你CPU闲置了?你是一万核CPU每个核都是3G HZ还是?
你CPU闲置你系统怎么在跑..你在运行程序的时候你鼠标为什么在动?
CPU在扯蛋吧?
人家提出有建设性的问题不管不问就跟人家纠结其他的..
编译器优化过你又知道?
你这个统计时间的本身就不准你有知道?
你的for循环被编译成什么样子你又知道.?
xboxeer 2011-05-31
  • 打赏
  • 举报
回复
建议楼主编译后看看IL代码 你那个str="a"对于程序可谓丝毫没有影响 string类的驻留机制决定了当第一次分配之后所有str="a"这个东西都不会产生新的实例 而只是将其指针指向CLR内部的字符串驻留的表而已
我倒觉得多说情况下是编译器做了优化 甚至于是JIT将其实时转化为CPU指令的时候做了些变化
YFLK 2011-05-31
  • 打赏
  • 举报
回复
楼主说的是最内层for用于耗时计算,外层for的嵌套层数决定最内层for的性能。建议楼主将内层For中的耗时计算用原生的赋值运算试试。
毕竟你的前两个例子内层耗时运算不是一个方法。
草根豆 2011-05-31
  • 打赏
  • 举报
回复
难道是与 CPU的设计有关?
加载更多回复(71)

110,566

社区成员

发帖
与我相关
我的任务
社区描述
.NET技术 C#
社区管理员
  • C#
  • Web++
  • by_封爱
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

让您成为最强悍的C#开发者

试试用AI创作助手写篇文章吧