你能想到吗 if a then b else c 中的else有问题?

dqlihb 2008-10-19 04:46:50
我是这样试的,

for i:=0 to 1500000 do
if a then
begin
b //执行次数1500000-1000次
end else
begin
c //执行1000次
end;

b,c中都要操作数组,其中c 控制条件a,
问题是:
假设c的代码为空,执行时间就是70,
C不为空时,单独测试C,1000次循环所花时间仅为10

但如果同时测试ABC
总时间就是150,也就是说 else 似乎用了70的时间?
...全文
122 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
僵哥 2008-10-19
  • 打赏
  • 举报
回复
i := 0; 
while i <= 1500000 do
begin
procedure_b(i);
inc(i,2);
end;
i := 1;
while i <= 1499999 do
begin
procedure_c(i);
inc(i,2);
end;

僵哥 2008-10-19
  • 打赏
  • 举报
回复
这里面除了多出来的指令以外,同时还有CPU指令流当中的预测失败问题,这个问题计算机组成原理当中应该都有讲.
for i:=0 to 1500000 do 
if (i % 2) = 0 then
begin
procedure_b(i);
end else
begin
procedure_c(i);
end;


象这样子的指令,拆成
[code=Delphi(Pascal)i := 0;
while i <= 1500000 do
begin
procedure_b;
inc(i,2);
end;
i := 1;
while i <= 1499999 do
begin
procedure_c;
end;[/code]
效率会有相当大的差别.
僵哥 2008-10-19
  • 打赏
  • 举报
回复
if ... else ...这当中多了条件跳转指令,执行那么多次,CPU就要多执行N条指令,当然时间会拉长.
五维思考 2008-10-19
  • 打赏
  • 举报
回复
什么乱七八糟的,没看明白
panrongzeng 2008-10-19
  • 打赏
  • 举报
回复
你是说应该B比C的时间大很多吧?
但是C的代码多啊,也许循环一次的时间比远远小于几行代码的时间比
所以说问题不奇怪
dqlihb 2008-10-19
  • 打赏
  • 举报
回复
单独执行B,大约70

C的代码比B多,但是C的执行次数少
bob008 2008-10-19
  • 打赏
  • 举报
回复
你就说单独运行B要多长时间吧

16,749

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 语言基础/算法/系统设计
社区管理员
  • 语言基础/算法/系统设计社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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