如何解決速度上的差別 |
答題得分者是:aquarius
|
adonis
高階會員 發表:140 回覆:258 積分:159 註冊:2002-04-15 發送簡訊給我 |
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 發送簡訊給我 |
adonis您好:
抱歉,我之前沒看清楚下面的程式是我開啟RAW檔案的方式您參考看看
一張512*512的影像大約1秒可以開啟 P4 2G 512MB RAM
TMemoryStream* ima = new TMemoryStream(); ima->LoadFromFile(檔案名稱); BYTE bBuf=0; for (int i=0;i順心 <>~我也是在學習的階段,回答的不好請您多多見諒與指教~> 發表人 - |
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言:你 DELPHI 的部份程式弄錯了, 多做了重覆的動作. 參考下列, 應該快很多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所致,請各位前輩多多指導該如何改善與修改,不甚感激,謝謝。 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 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: 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 發送簡訊給我 |
|
aquarius
資深會員 發表:3 回覆:347 積分:330 註冊:2003-05-21 發送簡訊給我 |
引言: aquarius 謝謝您的幫忙,的確相當相當快了。但相較於C的寫法,C著實簡單多了,為什麼會相差這麼多?一樣的寫法為什麼不同的 COMPILER 編出來速度會差這麼多, 這個問題要去問做 COMPILER 的人呀!!... :) DELPHI 的 PIXELS FUNCTION 指令很慢, 因為他是被層層的物件包起來的. 因為已經很明確的知道要做什麼動作, 所以我改用 Memory 的運算. 用這種方式來做, 大概只有用組合語言來做才會更快了.... ...
------
水瓶男的blog: http://791909.blogspot.com |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |