線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:2153
推到 Plurk!
推到 Facebook!

如何解決速度上的差別

答題得分者是:aquarius
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#1 引用回覆 回覆 發表時間:2003-07-19 13:32:12 IP:210.203.xxx.xxx 未訂閱
 
FILE *Original_image_fp;
char data;
Original_image   = Edit1->Text;
// Read Original Image In Canvas (*.Raw)
Original_image_fp = fopen(Original_image.c_str(), "rb");
for (int y= 0;y<256;y  )
  for (int x= 0;x<256;x  ){
    data = fgetc(Original_image_fp);
    OriginalImageCanvas->Canvas->Pixels[x][y]=PutPixelGray(data);
  }
fclose(Original_image_fp);    TColor __fastcall TForm1::PutPixelGray(char Pixel)
{
return  (Pixel&0x000000FF)|((Pixel<<8)&0x0000FF00)|((Pixel<<16&0x00FF0000);
}
procedure TForm1.Button1Click(Sender: TObject);
var
   Source:TFileStream;
   x,y,z:Integer;
   data:TColor;
   Buf:array[0..65535] of Byte;
begin
   Source := TFileStream.Create('D:\test\030118\LENA.raw',fmShareDenyWrite);
   Source.ReadBuffer(Buf,65536);         
   z := 0;                               
   for y:=0 to 255 do begin
    for x:=0 to 255 do begin
      data := putpixelgray(Buf[z]);
      Image1.Canvas.Pixels[x,y] := RGB(data,data,data);
      Inc(z);
    end;
   end;
   Label1.Caption := 'LENA Origenal Image for 256x256  8 bits';
   Source.Free;
end;    function TForm1.PutPixelGray(Pixel:Byte):TColor;
begin
result:=(Pixel and $000000FF) or ( (Pixel shl 8) and $0000FF00) or ((Pixel shl 16) and $00FF0000);
end;
各位前輩,上述的兩段程式皆是用來讀取並秀出灰階 256x256 的程式。但不知為何以Delphi的方式所撰寫的執行起來比C的方式還慢?尤其在讀取的影像若為 512x512 或更大時其速度上的差異更是明顯,在效能較差的電腦上執行時其差異也相當明顯,不知是Delphi的限制還是使用了不適當的Function所致,請各位前輩多多指導該如何改善與修改,不甚感激,謝謝。
------
我也在努力學習中,若有錯謬請見諒。
taishyang
站務副站長


發表:377
回覆:5490
積分:4563
註冊:2002-10-08

發送簡訊給我
#2 引用回覆 回覆 發表時間:2003-07-19 14:31:26 IP:61.231.xxx.xxx 未訂閱
adonis您好:     抱歉,我之前沒看清楚下面的程式是我開啟RAW檔案的方式您參考看看 一張512*512的影像大約1秒可以開啟 P4 2G 512MB RAM
 
 TMemoryStream* ima = new TMemoryStream();
   ima->LoadFromFile(檔案名稱);
   BYTE bBuf=0;
   for (int i=0;iSize;i  )
    {
     ima->Position=i;
     bBuf=i;
     ima->Read(&bBuf,1);
     pixel[i]=bBuf;
    }
   delete ima;
   }
  for (y=0;y<512;y  )
   {
    for (x=0;x<512;x  )
     {
      color=((256*pixel[count] pixel[count 1]))/16;
      SetPixel(Image1->Canvas->Handle, x,y,TColor(RGB(color,color,color)));
      count =2;
     }
   }
順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~ 發表人 -
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#3 引用回覆 回覆 發表時間:2003-07-21 16:17:29 IP:211.23.xxx.xxx 未訂閱
引言:
 
FILE *Original_image_fp;
char data;
Original_image   = Edit1->Text;
// Read Original Image In Canvas (*.Raw)
Original_image_fp = fopen(Original_image.c_str(), "rb");
for (int y= 0;y<256;y  )
  for (int x= 0;x<256;x  ){
    data = fgetc(Original_image_fp);
    OriginalImageCanvas->Canvas->Pixels[x][y]=PutPixelGray(data);
  }
fclose(Original_image_fp);    TColor __fastcall TForm1::PutPixelGray(char Pixel)
{
return  (Pixel&0x000000FF)|((Pixel<<8)&0x0000FF00)|((Pixel<<16&0x00FF0000);
}
procedure TForm1.Button1Click(Sender: TObject);
var
   Source:TFileStream;
   x,y,z:Integer;
   data:TColor;
   Buf:array[0..65535] of Byte;
begin
   Source := TFileStream.Create('D:\test\030118\LENA.raw',fmShareDenyWrite);
   Source.ReadBuffer(Buf,65536);         
   z := 0;                               
   for y:=0 to 255 do begin
    for x:=0 to 255 do begin
      data := putpixelgray(Buf[z]);
      Image1.Canvas.Pixels[x,y] := RGB(data,data,data);
      Inc(z);
    end;
   end;
   Label1.Caption := 'LENA Origenal Image for 256x256  8 bits';
   Source.Free;
end;    function TForm1.PutPixelGray(Pixel:Byte):TColor;
begin
result:=(Pixel and $000000FF) or ( (Pixel shl 8) and $0000FF00) or ((Pixel shl 16) and $00FF0000);
end;
各位前輩,上述的兩段程式皆是用來讀取並秀出灰階 256x256 的程式。但不知為何以Delphi的方式所撰寫的執行起來比C的方式還慢?尤其在讀取的影像若為 512x512 或更大時其速度上的差異更是明顯,在效能較差的電腦上執行時其差異也相當明顯,不知是Delphi的限制還是使用了不適當的Function所致,請各位前輩多多指導該如何改善與修改,不甚感激,謝謝。
你 DELPHI 的部份程式弄錯了, 多做了重覆的動作. 參考下列, 應該快很多
procedure TForm1.Button1Click(Sender: TObject);
var
   Source:TFileStream;
   x,y,z:Integer;
   data:byte;
   Buf:array[0..65535] of Byte;
begin
   Source := TFileStream.Create('D:\test\030118\LENA.raw',fmShareDenyWrite);
   Source.ReadBuffer(Buf,65536);         
   z := 0;                               
   for y:=0 to 255 do begin
    for x:=0 to 255 do begin
      data := Buf[z];
      Image1.Canvas.Pixels[x,y] := RGB(data,data,data);
      Inc(z);
    end;
   end;
   Label1.Caption := 'LENA Origenal Image for 256x256  8 bits';
   Source.Free;
end;     
...Aquarius
------
水瓶男的blog: http://791909.blogspot.com
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#4 引用回覆 回覆 發表時間:2003-07-22 13:11:47 IP:163.15.xxx.xxx 未訂閱
aquarius, 其實您說的那部份影響並不是很大,以第一段C的程式來讀512x512比第二段以Delphi程式來跑,其中的差異就相當明確了。
------
我也在努力學習中,若有錯謬請見諒。
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#5 引用回覆 回覆 發表時間:2003-07-22 16:04:05 IP:211.23.xxx.xxx 未訂閱
引言: aquarius, 其實您說的那部份影響並不是很大,以第一段C的程式來讀512x512比第二段以Delphi程式來跑,其中的差異就相當明確了。
要快是吧!! 試試這段程式, 在我的電腦上, 512*512 只要 0.02 秒... :)
procedure TForm1.Button1Click(Sender: TObject);
const
  _iSize=512*512 ;
var
  bmp : TBitmap ;
  dwLast :DWORD ;
  Info: PBitmapInfo;
  InfoSize: Cardinal;
  Image, OrgImage: PByte;
  ImageSize: Cardinal;
  i : integer ;
  b : byte ;
  pb : pbyte ;
  ms : TMemoryStream ;
begin
  ms:=TMemoryStream.Create ;
  if FileExists('test.raw') then
    ms.LoadFromFile('test.raw')
  else
    begin
    for i:=0 to _iSize-1 do
      begin
      b:=i mod 256 ;
      ms.Write(b,1) ;
      end ;
    ms.SaveToFile('test.raw') ;
    end ;      dwLast:=GetTickCount ;
  bmp:=TBitmap.Create ;
  bmp.PixelFormat:=pf24bit ;
  bmp.Width:=512 ;
  bmp.Height:=512 ;      pb:=ms.Memory ;
  with bmp do
    begin
    GetDIBSizes(Handle, InfoSize, ImageSize);
    Info := AllocMem(InfoSize);
    try
      Image := AllocMem(ImageSize);
      OrgImage:=Image ;
      try
        GetDIB(Handle, Palette, Info^, Image^);
        for i:=0 to _iSize-1 do
          begin
          pbyte(Image)^:=pb^ ;
          inc(Image) ;
          pbyte(Image)^:=pb^ ;
          inc(Image) ;
          pbyte(Image)^:=pb^ ;
          inc(Image) ;              inc(pb) ;
          end ;
        Image:=OrgImage ;
        
        /// SetDIBits(canvas.handle,Handle,0,512,Image,info^,DIB_RGB_COLORS);
        with Info^.bmiHeader do
          StretchDIBits(canvas.Handle,
                        0,
                        0,
                        511,
                        511,
                        0,
                        0,
                        biWidth,
                        biHeight,
                        Image,
                        Info^,
                        DIB_RGB_COLORS,
                        SRCCOPY);
      finally
        FreeMem(Image, ImageSize);
        end;
    finally
      FreeMem(Info, InfoSize);
      end;
    end;      image1.picture.graphic:=bmp ;
  bmp.free ;
  caption:=format('time=%d',[getTickCount-dwLast]) ;
end;     
這樣夠快了吧!!... ...
------
水瓶男的blog: http://791909.blogspot.com
adonis
高階會員


發表:140
回覆:258
積分:159
註冊:2002-04-15

發送簡訊給我
#6 引用回覆 回覆 發表時間:2003-07-22 16:36:53 IP:163.15.xxx.xxx 未訂閱
aquarius 謝謝您的幫忙,的確相當相當快了。但相較於C的寫法,C著實簡單多了,為什麼會相差這麼多?
------
我也在努力學習中,若有錯謬請見諒。
aquarius
資深會員


發表:3
回覆:347
積分:330
註冊:2003-05-21

發送簡訊給我
#7 引用回覆 回覆 發表時間:2003-07-22 17:01:37 IP:211.23.xxx.xxx 未訂閱
引言: aquarius 謝謝您的幫忙,的確相當相當快了。但相較於C的寫法,C著實簡單多了,為什麼會相差這麼多?
一樣的寫法為什麼不同的 COMPILER 編出來速度會差這麼多, 這個問題要去問做 COMPILER 的人呀!!... :) DELPHI 的 PIXELS FUNCTION 指令很慢, 因為他是被層層的物件包起來的. 因為已經很明確的知道要做什麼動作, 所以我改用 Memory 的運算. 用這種方式來做, 大概只有用組合語言來做才會更快了.... ...
------
水瓶男的blog: http://791909.blogspot.com
系統時間:2024-04-17 7:14:19
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!