首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

[送分题] 哪种循环速度快?解决方案

2012-03-12 
[送分题] 哪种循环速度快?最近做对速度很敏感的程序,用到大量循环.想知道那种速度更快.循环体内执行语句相

[送分题] 哪种循环速度快?
最近做对速度很敏感的程序,用到大量循环.想知道那种速度更快.

循环体内执行语句相同.
int   i;

//   1
for   (i   =   0;   i   <   256;   i++)
{
//....
}

//2
i   =   256;
while(i--)
{
//......
}

//3
i   =   0;
do
{
//....
}while(i++   <   255);


[解决办法]
好象是for語句會快一點。說是會對 for(int i = 0 ;;)那個i 執行寄存器優化。
而while或do while則不優化。

[解决办法]
好象是for速度快,对比一下汇编代码就知道了。
[解决办法]
是for速度快
[解决办法]
快也快不到哪去,没什么意义,从这个角度优化性能,效果不大。
[解决办法]
个人认为最快的循环
for(int i = 256; i> 0 i--)
{}
for是否优于while我不清楚
与0作比较的确优于与其他数字比较
个人愚见

也许用goto也比较快
[解决办法]
听讲的来了,接分的来了。。。
以后坚持用FOR语句。。。
[解决办法]
没研究过,个人习惯for,不行就用while,do while极度少用
[解决办法]
我一直以为一样快
学习
[解决办法]
奇怪了,怎么都喜欢用for?我也是...



[解决办法]
for最快,这个在Pascal里好像也是
测一下就知道了
[解决办法]
for(register int i = 0; i < 256; i++)更好一点
不过不加register,优化时也可能自动加上
[解决办法]
这种优化??
没有必要优化,
更为重要的是优化循环内的代码!!!
[解决办法]
这种优化??
没有必要优化,
更为重要的是优化循环内的代码!!!

可不可以,直接访问存储地址。。。


[解决办法]
for (i = 0; i < 256; ++i)
{
//....
}
for(int i = 256; i> 0 ;--i)
{}
[解决办法]
我只在以下情况下用 do...while, 比用 for 稍方便

do {

if(!...) break;
...
if(!...) break;
...
if(!...) break;
...
}
while(false);
[解决办法]
我习惯有while(){}感觉还可以.
[解决办法]
大师都建议用for

这个速度是编译器决定的吧
[解决办法]
do {

if(!...) break;
...
if(!...) break;
...
if(!...) break;
...
}
while(false);
这个好啊,我也用,我基本就拿他代替goto,
[解决办法]
for快
[解决办法]
看能不能改成少用循环的算法
[解决办法]
2比3快 至于1是否比2快 不知道
------解决方案--------------------


for 汇编代码最少,也就快一些
[解决办法]
我感觉for快。

[解决办法]
其实用for和while还不是速度方面的考虑,关键是看是否预先知道循环次数。有些地方无法互换。
[解决办法]
习惯用for()
不过有时还顺便用下goto
还是要习惯一下 do while...
[解决办法]
问个问题,你们都说do while语句的汇编最长,需要时间最多,是否有考虑指令的周期.里面的指令到底是几个时间片的??
而且有没有考虑流水线的影响??
[解决办法]
有没有人考虑过CPU的一级缓存和二级缓存,及缓存命中的问题?
[解决办法]
有没有人考虑过CPU的一级缓存和二级缓存,及缓存命中的问题?
--------
这个不用考虑吧,这些肯定是在一样的情况下比较的.
[解决办法]
比较喜欢用for
[解决办法]
/----------------------------------------------------
// 1
for (i = 0; i < 256; i++)
{
//....
}
xor edx edx
mov [ebp-0x40],edx
...
inc dword ptr [ebp-0x40]
cmp [ebp-0x40],0x00000100
jl -0x39
//----------------------------------------------------
//2
i = 256;
while(i--)
{
//......
}
mov [ebp-0x40],0x00000100
jmp +0x2d
...
mov ecx,[ebp-0x40]
add dword ptr [ebp-0x40],-0x01
test ecx,ecx
jnz -0x38
//----------------------------------------------------
//3
i = 0;
do
{
//....
}while(i++ < 255);
xor eax eax
mov [ebp-0x40],eax
...
mov ecx,[ebp-0x40]
inc dword ptr [ebp-0x40]
cmp ecx,0x000000ff
jl -0x3b
//----------------------------------------------------
// 4
for (i = 0; i < 256; i++)
{
//....
}
mov [ebp-0x40],0x000000ff
...
dec dword ptr [ebp-0x40]
cmp dword ptr [ebp-0x40],0x00
jnl -0x36
//----------------------------------------------------

^_^
在这里,定义使用
int i

register int i;
汇编出来的代码是一样的

C++ Builder 6.0 pack2
complier-> code optimization-> none/speed
基本一样
[解决办法]
有没有人考虑过CPU的一级缓存和二级缓存,及缓存命中的问题?

_________________________________________________________

另外,对于一、二级缓存,由于对于for/while/do都存在jump的问题
所以一、二级缓存的处理,应该差别不大
只是,有一点奇怪在编译的代码中,都没有使用AX/BX等寄存器变量
而是使用的EBP,是不是BCB出于统一和通用的考虑。

其实,自己写汇编最快了 ^_^
[解决办法]
修正:

// 4
for (i = 255; i > = 0; i++)
{
//....
}
mov [ebp-0x40],0x000000ff
...
dec dword ptr [ebp-0x40]
cmp dword ptr [ebp-0x40],0x00
jnl -0x36
[解决办法]
这种优化??
没有必要优化,
更为重要的是优化循环内的代码!!!
[解决办法]
服了你们
[解决办法]
都是来接分的啦,哈哈
[解决办法]
潜力贴 不得不来捧场

个人同意三十年孤独

应该在for里面的数据处理下功夫
而不是for本身
[解决办法]
都优化到这地步了 !学习
------解决方案--------------------


学习,同时接分。

热点排行