for i:=0 to vRcdData.RecordCount-1 do  //vRcdData.RecordCount=11688
    Begin
      vsXmBh:=arrayresult[0,i];
      vsYear:=arrayresult[2,i];
      If vsXmBh<>vsOldXmBh Then
      Begin
        vsQJNXML:=vsQJNXML+'></R><R ';
        vsQJNXML:=vsQJNXML+' ZHNM='''+arrayresult[0,i]+'''';
        vsQJNXML:=vsQJNXML+' YEAR='''+arrayresult[2,i]+'''';
        //vsQJNXML:=vsQJNXML+' YSDL'+vsXmuid2+'='''+vartostr(arrayresult[5,i])+'''';
        vsOldXmBh:=vsXmBh;
        vsOldYear:=vsYear;
      End
      Else
      Begin        
        If (vsYear<psStartYear) AND (vsXmBh=vsOldXmBh) AND (vsYear<>vsOldYear) AND (psLastYear='Y') Then
        Begin
          vsQJNXML:=vsQJNXML+'></R><R ';
          vsQJNXML:=vsQJNXML+' YEAR='''+arrayresult[2,i]+'''';
          //vsQJNXML:=vsQJNXML+' YSDL'+vsXmuid2+'='''+vartostr(arrayresult[5,i])+'''';
          vsOldYear:=vsYear;
        End;
      End;
      vsXmuid2:=arrayresult[1,i];
      vsysqj:=arrayresult[3,i];      if vsysqj<>'0' then
        vsQJNXML:=vsQJNXML+' YSDL'+vsXmuid2+'='''+vartostr(arrayresult[5,i])+'''';      for j:=0 to 1 do
      Begin        if arrayNR[4,j]='0' then
        begin
         If arrayresult[5,i]='1' Then
           vsQJNXML:=vsQJNXML+' F'+vsysqj+vsXmuid2+arrayNR[5,j]+'='''+FormatFloat(vsDlFormat,arrayresult[Arrcols[j],i])+''''
         ELSE
           vsQJNXML:=vsQJNXML+' F'+vsysqj+vsXmuid2+arrayNR[5,j]+'='''+FormatFloat(vsJeFormat,arrayresult[Arrcols[j],i])+'''';
        end
        Else
        begin
          vsQJNXML:=vsQJNXML+' F'+vsysqj+vsXmuid2+arrayNR[5,j]+'='''+vartostr(arrayresult[Arrcols[j],i])+'''';
        end;        If psRealData='Y' Then
        Begin
          if arrayNR[4,j]='0' then
          begin
              If arrayresult[5,i]='1' Then
                vsQJNXML:=vsQJNXML+' FSJ'+vsysqj+vsXmuid2+arrayNR[5,j]+'='''+FormatFloat(vsDlFormat,arrayresult[Arrcols[j],i])+''''
              ELSE
                vsQJNXML:=vsQJNXML+' FSJ'+vsysqj+vsXmuid2+arrayNR[5,j]+'='''+FormatFloat(vsJeFormat,arrayresult[Arrcols[j],i])+'''';
          end
          Else
              vsQJNXML:=vsQJNXML+' FSJ'+vsysqj+vsXmuid2+arrayNR[5,j]+'='''+vartostr(arrayresult[Arrcols[j],i])+''' ';
        End;
      End;
    End;这段代码运行居然要3分多钟, 我的机器是酷睿的,2G内存
啥问题呢, 怎么能优化一下

解决方案 »

  1.   

    字符串操作DELPHI已经很快了,但大字符串的循环相加性能仍然较差。可以使用
    var
      slQJNXML :TStringList;  slQJNXML := TStringList.Create;  //vsQJNXML:=vsQJNXML+'></R><R ';
      修改为:
      sl.Add('></R><R ');
     
      后面类推。  最后用
      vsQJNXML := slQJNXML.Text;  即可。这种方法有个缺点,就是每次add的字符串之间有 回车。
    如果不想要回车的话,可以:  TMyStringList = class (TStringList)
      protected
        function GetTextStr: string; override;
      end;function TMyStringList.GetTextStr: string;
    var
      I, L, Size, Count: Integer;
      P: PChar;
      S, LB: string;
    begin
      Count := GetCount;
      Size := 0;
      LB := ''; ///sLineBreak;
      for I := 0 to Count - 1 do Inc(Size, Length(Get(I)) + Length(LB));
      SetString(Result, nil, Size);
      P := Pointer(Result);
      for I := 0 to Count - 1 do
      begin
        S := Get(I);
        L := Length(S);
        if L <> 0 then
        begin
          System.Move(Pointer(S)^, P^, L);
          Inc(P, L);
        end;
        L := Length(LB);
        if L <> 0 then
        begin
          System.Move(Pointer(LB)^, P^, L);
          Inc(P, L);
        end;
      end;
    end;然后用
      slQJNXML :TMyStringList;即可。
      

  2.   

    经过验证, 采用stringlist速度大大提高
    这段程序的执行几乎不需要花费时间, 真的非常感谢