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;    
这段代码运算非常慢,我想让它运行快一点。  
小弟在此求助于各位大大,怎样优化这段代码让它运行得快起来

解决方案 »

  1.   

    这个还得看 
     begin 
       .......  这里面的内容 
     end;    也就是得看你要实现什么?如果是数学计算可能用一个公式就能解决,但是如果需求分析结果必须如此,那么就不好办
      

  2.   

    谢谢各位大大的关注,我现在把代码补上来。期待你們的幫助,謝謝。
    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;    
      

  3.   

    再补充一下,a,b,c,d,e,f都是小于10大于0的正整数.
      

  4.   

    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当中添加记录的过程.先前的贴子当中很多朋友已经提到了,我就不再重复了.
      

  5.   

    z2这重循环不仅可以计算出z2*b,同时还可以计算出[z1*a]的值加上z2*b,不是么?
      

  6.   

    大家试试看这段代码,我耐心不够没等到结果
    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;
      

  7.   

    謝謝樓上大大的指點。我等下試試,相信速度會提高很多,希望得到理想的效果。
    你說真正需要优化的仍然还是ClientDataSet2当中添加记录的过程
    是不是說,真正影響運行速度的是ClientDataSet2添加记录的过程,而不是循環的次數?
    也就是說因為符合條件的記錄太多,所以在添加過程中占用的時間比判斷所用的時間多得多?
    如果是這樣的話,優化循環還是沒有解決最終問題,但是確實有那麼多符合條件的數據,
    請多多指點,小弟感謝不盡。
      

  8.   

    1.在你的程序当中最需要优化的是ClientDataSet添加记录的消耗(整体过程),前面的贴子,包括我在8楼也已经说过了,这是最为关键的;
    2.你本贴的主题就是让优化你的循环,我自然是告诉你在你所给出的代码的基础上如何进行优化,而你却说这个没有太多意义,明知道没有太多意义,那还多余发这个贴子?我就不明白,之前贴子当中那么多朋友告诉你如何如何进行优化,而你全然不当一回事,这让大家都显得非常的无辜.
      

  9.   

    这个题应该是学校里面的测试用的题吧.....个人看了一下题目,没什么目地性.不向是要干什么,纯粹测试.
    >>>建议该程序,在INTER高频,多颗,带浮点运算器的机器上面进行运算,最好是找至强服务器进行运算.
    11楼,只是帮你算一下,你的程序所要运行的时间,呵呵,这还是空运的.加上你的代码,估计要比算出来的大.
      

  10.   

    先这样优化一下,原来的代码有太多的无用循环了。  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
      

  11.   

    謝謝各位的參與與指點,尤其是僵哥。同時也向大家說聲抱歉,我不當的言語讓大家感到不愉快,這並非出自我的本意,我只是想更加弄明白一點,因為開始我一直以為是因為循環次數才影響了運行的速度,根本沒有想到因為添加記錄而影響速度。後來僵哥詳細地指出問題所在(其實前面,大家已經指出,只是當時我還是很糊塗),我才去注意那個添加過程,但是又不是很肯定,所以就再發帖詢問,也因此說一些當的言語,讓大家不愉快。再次抱歉。我現在將按僵哥的指點的方法,對循環和添加記錄進行優化。我現在就結帖。
    順便想請大家關注一下
    http://topic.csdn.net/u/20081107/10/ea739455-dd10-4ab1-9a60-10350ba63926.html
    ,是這個帖子的原型,因為想法出不來什麼好辦法,就簡化了一些東西,變成這個帖子這樣了。
      

  12.   

    我觉得减少循环次数才是关键 分该给jadeluo
    如果clientdataset2有连接的数据源,那么循环前先DataSource1.DataSet := nil;
      

  13.   

    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条.