for z1 :=1 to 200 do for Z2 := 1 to 200 do for Z3 := 1 to 200 do for Z4 := 1 to 200 do for Z5 := 1 to 200 do for Z6 := 1 to 200 do begin ....... end; 这段代码运算非常慢,我想让它运行快一点。 小弟在此求助于各位大大,怎样优化这段代码让它运行得快起来
这个还得看 begin ....... 这里面的内容 end; 也就是得看你要实现什么?如果是数学计算可能用一个公式就能解决,但是如果需求分析结果必须如此,那么就不好办
谢谢各位大大的关注,我现在把代码补上来。期待你們的幫助,謝謝。 for z1 :=1 to 200 do for Z2 := 1 to 200 do for Z3 := 1 to 200 do for Z4 := 1 to 200 do for Z5 := 1 to 200 do for Z6 := 1 to 200 do begin //a,b,c,d,e,f 为已知数 都是正整数 if z1 *a + z2 *b + z3*c + z4 * d + z5 * e + z6 * f = 201 then begin clientdataset2.Append; clientdataset2.FieldValues['z1'] := z1; clientdataset2.FieldValues['z2'] := z2; clientdataset2.FieldValues['z3'] := z3; clientdataset2.FieldValues['z4'] := z4; clientdataset2.FieldValues['z5'] := z5; clientdataset2.FieldValues['z6'] := z6; clientdataset2.Post; end; end;
再补充一下,a,b,c,d,e,f都是小于10大于0的正整数.
for z1 :=1 to 200 do //能不能在这里计算z1 * a for Z2 := 1 to 200 do //能不能在这里计算z2 * b for Z3 := 1 to 200 do //... for Z4 := 1 to 200 do for Z5 := 1 to 200 do for Z6 := 1 to 200 do begin //a,b,c,d,e,f 为已知数 都是正整数 if z1 *a + z2 *b + z3*c + z4 * d + z5 * e + z6 * f = 201 then begin clientdataset2.Append; clientdataset2.FieldValues['z1'] := z1; clientdataset2.FieldValues['z2'] := z2; clientdataset2.FieldValues['z3'] := z3; clientdataset2.FieldValues['z4'] := z4; clientdataset2.FieldValues['z5'] := z5; clientdataset2.FieldValues['z6'] := z6; clientdataset2.Post; end; end; 真正需要优化的仍然还是ClientDataSet2当中添加记录的过程.先前的贴子当中很多朋友已经提到了,我就不再重复了.
z2这重循环不仅可以计算出z2*b,同时还可以计算出[z1*a]的值加上z2*b,不是么?
大家试试看这段代码,我耐心不够没等到结果 procedure TForm1.Button1Click(Sender: TObject); var I: Cardinal; Z1,Z2,Z3,Z4,Z5,Z6: Integer; begin I := GetTickCount; for Z1 :=1 to 200 do for Z2 := 1 to 200 do for Z3 := 1 to 200 do for Z4 := 1 to 200 do for Z5 := 1 to 200 do for Z6 := 1 to 200 do begin end; ShowMessage(IntToStr(I - GetTickCount)); end;
先这样优化一下,原来的代码有太多的无用循环了。 for z1 := 1 to 201 div a do for z2 := 1 to 201 div b do for z3 := 1 to 201 div c do for z4 := 1 to 201 div d do for z5 := 1 to 201 div e do for z6 := 1 to 201 div f do 再复杂一点的写法是: for z1 := 1 to 201 div a do for z2 := 1 to (201 - z1 * a) div b do for z3 := 1 to (201 - z1 * a - z2 * b) div c do for z4 := 1 to (201 - z1 * a - z2 * b - z3 * c) div d do for z5 := 1 to (201 - z1 * a - z2 * b - z3 * c - z4 * d) div e do for z6 := 1 to (201 - z1 * a - z2 * b - z3 * c - z4 * d - z5 * e) div f do
procedure TForm1.Button1Click(Sender: TObject); var I,J: Cardinal; Z1,Z2,Z3,Z4,Z5,Z6,a,b,c,d,e,f: Integer; begin ClientDataSet1.EmptyDataSet; DataSource1.DataSet := nil; I := GetTickCount; Z1:=1;Z2:=1;Z3:=1;Z4:=1;Z5:=1;Z6:=1; a:=3;b:=4;c:=5;d:=6;e:=7;f:=8; for z1 := 1 to 201 div a do for z2 := 1 to (201 - z1 * a) div b do for z3 := 1 to (201 - z1 * a - z2 * b) div c do for z4 := 1 to (201 - z1 * a - z2 * b - z3 * c) div d do for z5 := 1 to (201 - z1 * a - z2 * b - z3 * c - z4 * d) div e do for z6 := 1 to (201 - z1 * a - z2 * b - z3 * c - z4 * d - z5 * e) div f do if Z1*a+Z2*b+Z3*c+Z4*d+Z5*e+Z6*f = 201 then begin ClientDataSet1.Append; ClientDataSet1Z1.Value := Z1; ClientDataSet1Z2.Value := Z2; ClientDataSet1Z3.Value := Z3; ClientDataSet1Z4.Value := Z4; ClientDataSet1Z5.Value := Z5; ClientDataSet1Z6.Value := Z6; ClientDataSet1.Post; end; ShowMessage(IntToStr(GetTickCount - I)+' '+IntToStr(ClientDataSet1.RecordCount)); DataSource1.DataSet := ClientDataSet1; end;我CPU P4 2.8G, 耗时6.406s, 结果87956条.
begin
....... 这里面的内容
end; 也就是得看你要实现什么?如果是数学计算可能用一个公式就能解决,但是如果需求分析结果必须如此,那么就不好办
for z1 :=1 to 200 do
for Z2 := 1 to 200 do
for Z3 := 1 to 200 do
for Z4 := 1 to 200 do
for Z5 := 1 to 200 do
for Z6 := 1 to 200 do
begin //a,b,c,d,e,f 为已知数 都是正整数
if z1 *a + z2 *b + z3*c + z4 * d + z5 * e + z6 * f = 201 then
begin
clientdataset2.Append;
clientdataset2.FieldValues['z1'] := z1;
clientdataset2.FieldValues['z2'] := z2;
clientdataset2.FieldValues['z3'] := z3;
clientdataset2.FieldValues['z4'] := z4;
clientdataset2.FieldValues['z5'] := z5;
clientdataset2.FieldValues['z6'] := z6;
clientdataset2.Post;
end;
end;
//能不能在这里计算z1 * a
for Z2 := 1 to 200 do
//能不能在这里计算z2 * b
for Z3 := 1 to 200 do
//...
for Z4 := 1 to 200 do
for Z5 := 1 to 200 do
for Z6 := 1 to 200 do
begin //a,b,c,d,e,f 为已知数 都是正整数
if z1 *a + z2 *b + z3*c + z4 * d + z5 * e + z6 * f = 201 then
begin
clientdataset2.Append;
clientdataset2.FieldValues['z1'] := z1;
clientdataset2.FieldValues['z2'] := z2;
clientdataset2.FieldValues['z3'] := z3;
clientdataset2.FieldValues['z4'] := z4;
clientdataset2.FieldValues['z5'] := z5;
clientdataset2.FieldValues['z6'] := z6;
clientdataset2.Post;
end;
end; 真正需要优化的仍然还是ClientDataSet2当中添加记录的过程.先前的贴子当中很多朋友已经提到了,我就不再重复了.
procedure TForm1.Button1Click(Sender: TObject);
var
I: Cardinal;
Z1,Z2,Z3,Z4,Z5,Z6: Integer;
begin
I := GetTickCount;
for Z1 :=1 to 200 do
for Z2 := 1 to 200 do
for Z3 := 1 to 200 do
for Z4 := 1 to 200 do
for Z5 := 1 to 200 do
for Z6 := 1 to 200 do
begin
end;
ShowMessage(IntToStr(I - GetTickCount));
end;
你說真正需要优化的仍然还是ClientDataSet2当中添加记录的过程
是不是說,真正影響運行速度的是ClientDataSet2添加记录的过程,而不是循環的次數?
也就是說因為符合條件的記錄太多,所以在添加過程中占用的時間比判斷所用的時間多得多?
如果是這樣的話,優化循環還是沒有解決最終問題,但是確實有那麼多符合條件的數據,
請多多指點,小弟感謝不盡。
2.你本贴的主题就是让优化你的循环,我自然是告诉你在你所给出的代码的基础上如何进行优化,而你却说这个没有太多意义,明知道没有太多意义,那还多余发这个贴子?我就不明白,之前贴子当中那么多朋友告诉你如何如何进行优化,而你全然不当一回事,这让大家都显得非常的无辜.
>>>建议该程序,在INTER高频,多颗,带浮点运算器的机器上面进行运算,最好是找至强服务器进行运算.
11楼,只是帮你算一下,你的程序所要运行的时间,呵呵,这还是空运的.加上你的代码,估计要比算出来的大.
for z2 := 1 to 201 div b do
for z3 := 1 to 201 div c do
for z4 := 1 to 201 div d do
for z5 := 1 to 201 div e do
for z6 := 1 to 201 div f do
再复杂一点的写法是: for z1 := 1 to 201 div a do
for z2 := 1 to (201 - z1 * a) div b do
for z3 := 1 to (201 - z1 * a - z2 * b) div c do
for z4 := 1 to (201 - z1 * a - z2 * b - z3 * c) div d do
for z5 := 1 to (201 - z1 * a - z2 * b - z3 * c - z4 * d) div e do
for z6 := 1 to (201 - z1 * a - z2 * b - z3 * c - z4 * d - z5 * e) div f do
順便想請大家關注一下
http://topic.csdn.net/u/20081107/10/ea739455-dd10-4ab1-9a60-10350ba63926.html
,是這個帖子的原型,因為想法出不來什麼好辦法,就簡化了一些東西,變成這個帖子這樣了。
如果clientdataset2有连接的数据源,那么循环前先DataSource1.DataSet := nil;
var
I,J: Cardinal;
Z1,Z2,Z3,Z4,Z5,Z6,a,b,c,d,e,f: Integer;
begin
ClientDataSet1.EmptyDataSet;
DataSource1.DataSet := nil;
I := GetTickCount;
Z1:=1;Z2:=1;Z3:=1;Z4:=1;Z5:=1;Z6:=1;
a:=3;b:=4;c:=5;d:=6;e:=7;f:=8;
for z1 := 1 to 201 div a do
for z2 := 1 to (201 - z1 * a) div b do
for z3 := 1 to (201 - z1 * a - z2 * b) div c do
for z4 := 1 to (201 - z1 * a - z2 * b - z3 * c) div d do
for z5 := 1 to (201 - z1 * a - z2 * b - z3 * c - z4 * d) div e do
for z6 := 1 to (201 - z1 * a - z2 * b - z3 * c - z4 * d - z5 * e) div f do
if Z1*a+Z2*b+Z3*c+Z4*d+Z5*e+Z6*f = 201 then
begin
ClientDataSet1.Append;
ClientDataSet1Z1.Value := Z1;
ClientDataSet1Z2.Value := Z2;
ClientDataSet1Z3.Value := Z3;
ClientDataSet1Z4.Value := Z4;
ClientDataSet1Z5.Value := Z5;
ClientDataSet1Z6.Value := Z6;
ClientDataSet1.Post;
end;
ShowMessage(IntToStr(GetTickCount - I)+' '+IntToStr(ClientDataSet1.RecordCount));
DataSource1.DataSet := ClientDataSet1;
end;我CPU P4 2.8G, 耗时6.406s, 结果87956条.