[送分题] 哪种循环速度快?

cczlp 2007-03-28 09:40:11
最近做对速度很敏感的程序,用到大量循环.想知道那种速度更快.

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

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

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

//3
i = 0;
do
{
//....
}while(i++ < 255);
...全文
593 43 打赏 收藏 转发到动态 举报
写回复
用AI写文章
43 条回复
切换为时间正序
请发表友善的回复…
发表回复
zzddqq 2007-04-03
  • 打赏
  • 举报
回复
学习,同时接分。
wanglovec 2007-04-03
  • 打赏
  • 举报
回复
都优化到这地步了 !学习
cczlp 2007-04-03
  • 打赏
  • 举报
回复
for内循环优化后和for本身用的时间查不多了,一个数量级
huzhangyou 2007-04-03
  • 打赏
  • 举报
回复
潜力贴 不得不来捧场

个人同意三十年孤独

应该在for里面的数据处理下功夫
而不是for本身
cheneyhehe 2007-04-02
  • 打赏
  • 举报
回复
都是来接分的啦,哈哈
gel_ink 2007-04-02
  • 打赏
  • 举报
回复
服了你们
cczlp 2007-03-29
  • 打赏
  • 举报
回复
就是mov xor test jz jl 这样的指令, 我昨天晚上查了指令周期,
好像在奔腾CPU上都是两个时钟周期
Myu2006 2007-03-29
  • 打赏
  • 举报
回复
这种优化??
没有必要优化,
更为重要的是优化循环内的代码!!!
dragonhux 2007-03-29
  • 打赏
  • 举报
回复
修正:

// 4
for (i = 255; i >= 0; i++)
{
//....
}
mov [ebp-0x40],0x000000ff
...
dec dword ptr [ebp-0x40]
cmp dword ptr [ebp-0x40],0x00
jnl -0x36
dragonhux 2007-03-29
  • 打赏
  • 举报
回复
有没有人考虑过CPU的一级缓存和二级缓存,及缓存命中的问题?

_________________________________________________________

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

其实,自己写汇编最快了 ^_^
dragonhux 2007-03-29
  • 打赏
  • 举报
回复
/----------------------------------------------------
// 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
基本一样
constantine 2007-03-29
  • 打赏
  • 举报
回复
有没有人考虑过CPU的一级缓存和二级缓存,及缓存命中的问题?
--------
这个不用考虑吧,这些肯定是在一样的情况下比较的.
theLibra12 2007-03-29
  • 打赏
  • 举报
回复
有没有人考虑过CPU的一级缓存和二级缓存,及缓存命中的问题?
constantine 2007-03-29
  • 打赏
  • 举报
回复
问个问题,你们都说do while语句的汇编最长,需要时间最多,是否有考虑指令的周期.里面的指令到底是几个时间片的??
而且有没有考虑流水线的影响??
海嵌 2007-03-29
  • 打赏
  • 举报
回复
习惯用for()
不过有时还顺便用下goto
还是要习惯一下 do while...
i_love_pc 2007-03-29
  • 打赏
  • 举报
回复
其实用for和while还不是速度方面的考虑,关键是看是否预先知道循环次数。有些地方无法互换。
liuy_sea 2007-03-29
  • 打赏
  • 举报
回复
比较喜欢用for
Y___Y 2007-03-28
  • 打赏
  • 举报
回复
for(register int i = 0; i < 256; i++)更好一点
不过不加register,优化时也可能自动加上
daily66 2007-03-28
  • 打赏
  • 举报
回复
for最快,这个在Pascal里好像也是
测一下就知道了
BeRoy 2007-03-28
  • 打赏
  • 举报
回复
奇怪了,怎么都喜欢用for?我也是...


加载更多回复(23)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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