小弟编写ASP上传组件,浏览了网上几篇有关方面的文章,发现左轻候大侠的文章写得最好,但是我也发现其里面那个保存函数FileSaveAs速度很慢,如果超过2MB以上的文件,需要等很久时间才能上传完毕,基本上都已经出现页面超时!我改写了这个函数的文件流写入算法,发现速度还是提高不了多少,可能自己技术不到家吧!现在这里请教各位老大给予指点吧,谢谢了!我在线等待你们回复以下是FileSaveAs函数我自己改写写入文件流的代码,但是速度提高没有多少,请大家看看并给予指点吧:procedure TUploadFile.FileSaveAs(FileName: OleVariant);
Const vCount = 1024;
var
  fsout:TFileStream;
  vBuff: Array of Byte;
  vLength, vIndex, vEnd, vBuffCount: Integer;
begin
  fsout := TFileStream.Create(Filename,fmcreate);
  try
    ///vContentData := FFileData;
    vLength := Length(FContentDataTemp);
    repeat
      if (vLength -  fsout.Size) >= vCount then vBuffCount := vCount else vBuffCount := vLength -  fsout.Size;      SetLength(vBuff, vBuffCount);
      for vIndex := 1 to vBuffCount do
      begin
        vBuff[vIndex] := Byte(FContentDataTemp[vIndex])
      end;      fsout.WriteBuffer(vBuff, vBuffCount);      Delete(FContentDataTemp, 1, vBuffCount);    until fsout.Size >= vLength;    ///fsout.Write(Byte(FFileData[1]), Length(FFileData))
  finally
    fsout.Free;
  end;
end;其中 vContentData 和  FFileData都是String类型变量,实际上是数组变量

解决方案 »

  1.   

    为什么还搞个循环,复制、删除的,不一次性直接把FContentDataTemp写入文件?
      

  2.   

    太好了,终于有人解答!一次性写入CPU太占资源了(传输期间都是100%),而且速度也很慢(针对于10MB以上的)!我想修改为上传期间占CPU资源低点(不要超过50%),同时能加快速度等功能,可惜自己修为还不够!
      

  3.   

    看了一下,有二个地方太费时间:
    1.将FContentDataTemp拷贝到vBuff。
    2.Delete(FContentDataTemp, 1, vBuffCount);
    另外,看不出这个repeat有什么用。可以将接受数据和写入本地文件两个过程放在一起,接受多少,写入多少,随到随写.
    字符串可以直接写入,不用拷贝到另外一个buffer:
      fsout.Write((pchar(s))^,Length(s)).