for 循环的简单问题(50分)

  • 主题发起人 manmanchong
  • 开始时间
M

manmanchong

Unregistered / Unconfirmed
GUEST, unregistred user!
做for循环时,能不能设置步长?我做了个测试,当循环的步长为1时,delphi的速度是VB
速度的40倍,但是当循环步长不为1时,Delphi的速度比VB要慢3倍,我的方法如下代码所
示,问问各位可不可以象VB一样设置循环的步长(step 3)。
delphi:
for i_loop:= 0 to 50000000 do
begin
if (i_loop mod 3) = 0 then i:=i+1;
end;
vb:
For i_loop = 0 To 50000000 Step 3
i = i + 1
Next
 
var i,j:integer;

for i:=0 to (5000000 div 3) do
begin
j:=i*3;
// XXXXXXX
end;
 
好像不行,试一下下面的效率如何。
while i_loop<=50000000 do
begin
...
inc(i,3);
end;
 
楼上的,算错了吧!


好像是不可以的吧!
不过你可以先小算一下!
向上面这个,是不可以这样:
for i:=0 to (50000000 div 3) do
begin
i:=i+1;
end;
j:=i*3;
 
第一个例子比第二个例子要多进行50000000次mod和if判断,当然不会快!
---------------
顺便问一下,这样
For i_loop = 0 To 50000000 Step 3
i = i + 1
Next
和 For I_Loop = 0 to 166666666 do
I := I + 1;
有什么区别!这种功能有意义吗?请举个实际运用中的例子!
 
你让delphi老老实实做循环,而让vb一步三跃地跳着做,当然delphi变成乌龟了。
实现办法,虽然for没有提供步进循环,其实用while or repeat一样也可以达到同样目的。
i:=0;
repeat
i:=i+3;
userfunc(i)
//Here user can call his childfunc to dispose "i".
until i>50000;
 
随便举个例子吧:有个数组,a[0..5000],我只想对数组下标为3的倍数的元素赋值,如:
a[0]:=1;
a[3]:=2;
a[6]:=3
....
a[4998]:=4;
赋的值是我算好的。和数组下标没有关系
 
For I := 0 to 1666 do
a[I*3] := value;
 
以下算法可以实现你的要求:
const
maxlen=50000;
var
a:array [0..maxlen] of integer;
i,value:integer;
begin
i:=0;
value:=1;
repeat
i:=i+3;
a:=value;
inc(value);
until i>maxlen;
end;
 
谢谢各位了!结贴!
 
在循环方面delphi 确实比 vb 快出很多倍.正如上面多位大侠说的, delphi 要实现多步
循环卡可以用 hile 或 until 的呀. 不过我有点不解的为何这样:
delphi:
i_loop := 0 ;
While i_loop <= 50000000 do begin
i_loop:=i_loop+3;
i:=i+1;
end;

vb:
For i_loop = 0 To 50000000 Step 3
i = i + 1
Next
的i 的结果不相同.
 
多人接受答案了。
 
to DEN:
我只是让vb和delphi做相同的操作(+),才能比较出那个更快一啊!
 
顶部