저도 여기서 지나가다 본건데요.
델파이는 1 to 300 이런식으로 처음과 끝을 정하는 방식이기 때문에
C++의 for문과 속도 차이가 납니다.
델파이는 단순히 숫자를 더해주고 넘어가는 방식이지만,
C++의 for문은 초기조건, 종료조건, 진행수식 세 가지를 마음대로 설정할 수 있기 때문이죠.
단순한 숫자하나 증가 방식이 아니란 말이지요.
C++에서도 델파이에서 이루어지는 방식과 비슷하게 코드를 바꾸면
델파이와의 속도 차이가 매우 적어지거나 델파이보다 빨라질 것 같네요.
for(int i=0; i<30; i++)
이런 구문을
for(int i=30; i--; )
이와같이 바꿔주시면 됩니다.
이와 관련된 글이 이미 있으니 검색해보시는 것도 좋으실 듯 합니다.
장성호 님이 쓰신 글 :
: 안녕하세요
:
: 델마당 강좌,팁 정보 게시판에 조무영님께서 올려놓으신 "[팁] 색상 선택하기" 샘플코드를
: c++ Builder 바꿔보았습니다.
:
:
http://www.delmadang.com/cwb-bin/CrazyWWWBoard.exe?mode=vote&num=4718&db=dmdlec3&backdepth=2
:
:
: 그런데
: 색상파렛트를 만드는 함수를
: delphi와 거의 똑같이 만들었다고 생각되는데
:
: GetTickCout로 시간을 계산해보면
: Delphi가 두배이상 빠릅니다.
:
: 왜그런것이지 모르겟네요
:
:
: [조무영님의 delphi코드]
:
: procedure TMain.ColImageUpdate(MainCol: TColor);
: type
: PDWORDArray = PIntegerArray;
: var
: iX, iY, XMax, YMax: Integer;
: R, G, B, MainR, MainG, MainB: Byte;
: XBoganValue, YBoganValue: Single;
: P: PDWORDArray;
:
: iTic1,iTic2: Integer;
: begin
: iTic1 := GetTickCount;
:
: with ColImg do
: begin
: XMax:=Width;
: YMax:=Height;
: if Picture.Bitmap.Width <XMax then Picture.Bitmap.Width :=XMax;
: if Picture.Bitmap.Height<YMax then Picture.Bitmap.Height:=YMax;
:
: MainB:= MainCol and $FF;
: MainG:=(MainCol shr 8) and $FF;
: MainR:=(MainCol shr 16) and $FF;
:
: for iY:=0 to YMax-1 do
: begin
: P:=Picture.Bitmap.ScanLine[iY];
:
: for iX:=0 to XMax-1 do
: begin
: XBoganValue:=iX/XMax;
: YBoganValue:=iY/YMax;
: R:=Trunc(((MainR*XBoganValue)+($FF*(1-XBoganValue)))*(1-YBoganValue));
: G:=Trunc(((MainG*XBoganValue)+($FF*(1-XBoganValue)))*(1-YBoganValue));
: B:=Trunc(((MainB*XBoganValue)+($FF*(1-XBoganValue)))*(1-YBoganValue));
:
: //Canvas.Pixels[iX, iY]:=RGB(R, G, B); // 이건 느려서 못써요
: P[iX]:=(B shl 16) or (G shl 8) or R;
: end;
: end;
: iTic2 := GetTickCount;
:
: Label2.Caption := IntToStr(iTic2-iTic1);
:
: Repaint;
: end;
: end;
:
:
: [C++ Builder 변환 코드]
:
: //--------------------------------------------------------------------------
: void __fastcall TMain::ColImageUpdate(TColor MainCol )
: {
:
: int iX, iY, XMax, YMax;
: unsigned char R, G, B, MainR, MainG, MainB;
: float XBoganValue, YBoganValue;
:
: // RGBTRIPLE *pt;
: int *pt;
:
: int iTic1,iTic2;
:
: iTic1=GetTickCount();
: XMax=ColImg->Width;
: YMax=ColImg->Height;
: if ( ColImg->Picture->Bitmap->Width <XMax ) ColImg->Picture->Bitmap->Width =XMax;
: if ( ColImg->Picture->Bitmap->Height<YMax ) ColImg->Picture->Bitmap->Height=YMax;
:
: MainB= MainCol & 0xFF;
: MainG=(MainCol >> 8) & 0xFF;
: MainR=(MainCol >> 16) & 0xFF;
:
: for( iY=0 ; iY<YMax ;iY++)
: {
: pt=(int *)ColImg->Picture->Bitmap->ScanLine[iY];
:
: for( iX=0 ; iX< XMax;iX++)
: {
: XBoganValue=iX/(XMax*1.0);
: YBoganValue=iY/(YMax*1.0);
:
: R=((MainR*XBoganValue)+(0xFF*(1-XBoganValue)))*(1-YBoganValue);
: G=((MainG*XBoganValue)+(0xFF*(1-XBoganValue)))*(1-YBoganValue);
: B=((MainB*XBoganValue)+(0xFF*(1-XBoganValue)))*(1-YBoganValue);
:
: //ColImg->Canvas->Pixels[iX][iY]=RGB(R, G, B); // 이건 느려서 못써요
: //ColImg->Canvas->Pixels[iX][iY]=((B << 16) | (G << 8) | R); // 이것도 느림
:
:
: pt[iX]=((B << 16) | (G << 8) | R); //1)
: // pt[iX]=RGB(R, G, B); //2) 속도 빠름 - 1)번과 비슷함
: //결론::RGB()함수가 느린것이 아니라 ColImg->Canvas->Pixels[][] 함수가 느린것임
: // 그런데 이상하다 그렇게 해도 delphi보다 속도가 느린다 왜 그런것일까?
:
:
: }
: }
: iTic2=GetTickCount();
: Label2->Caption=IntToStr(iTic2-iTic1);
: ColImg->Repaint();
:
: }
: //-