과연 이코드에 최적화할 틈이 있을 까요??

김영현의 이미지

#define SIZE 10

void doSomething()
{
     int count = SIZE;
     unsigned long color = 0x4D00FF00;
     unsigned long dummySrc[SIZE] = {0,};
     unsigned long dummyDst[SIZE] = {0,};

     unsigned long *pDest = dummyDst;
     unsigned long *pSour = dummySrc;
     unsigned long sourFrac = (color >> 24);
     unsigned long destFrac;
     unsigned long sour1 = color & 0x00FF00FF;
     unsigned long sour2 = color & 0x0000FF00;
     unsigned long dest1, dest2;

     if (sourFrac == 0)
         return;

     destFrac = 255 - sourFrac;

     while (--count >= 0)
     {
         dest1 = *pDest & 0x00FF00FF;
         dest2 = *pDest & 0x0000FF00;
         dest1 = ((sour1 * sourFrac + dest1 * destFrac) >> 8) & 0x00FF00FF;
         dest2 = ((sour2 * sourFrac + dest2 * destFrac) >> 8) & 0x0000FF00;
         *pDest++ = (dest1 + dest2) | (*pDest & 0xFF000000);
     }
}

dummyDst, dummySrc는 제가 임의대로 잡은 것입니다. 임베디드 보드(ARM)에 UI 관련 그리기 함수(알파 블렌딩) 입니다. 어셈으로도 뽑아 보고, 이것 저것 웹도 뒤져보고 했는데... 제가 생각할 때는 틈이 없는 듯 합니다. 코드의 논리적인 부분은 바꾸지 않고 단순히 기교(꼼수) 만으로 성능을 향살 시킬 수 있을 까요? ㅠ_ㅠ

pool007의 이미지

loop unrolling이요.

안해보셨다면 해보세요.
http://www.lysator.liu.se/c/duffs-device.html

--
Passion is like genius; a miracle.

--
Passion is like genius; a miracle.

Q의 이미지

Logic 안바꾸고 최적화 할라믄..
local 변수 전역으로 바꿔보세요.
UI refresh면 상당히 많이 불릴텐데 불릴때마다 지역변수 잡고 불리고 해제하는 과정또한 overhead가 되겠네요.

specerx의 이미지

변수가 전역으로 선언된다면 이 변수는 메모리 상에 위치하게 됩니다.

메모리에 저장되어 있는 값보다 레지스터에 저장되어 있는 값을 읽고 쓰는것이 훨씬 빠릅니다.
메모리에서 읽고 쓰는 작업을 줄이기위해 지역변수가 레지스터에 할당 되는게 더 좋습니다.

"지역변수 잡고 불리고 해제하는 과정의 오버헤드"는 거의 없다고 보셔도 됩니다.
더 정확히는 범용으로 사용할 수 있는 레지스터 14개 안에서 지역변수가 사용된다는 조건하에서 그렇겠죠.

------------------------------

powerc20의 이미지

loop안에서 *pDest 이 3번 사용되네요.
이 부분을 local변수에 temp = *pDest라고 하시고 *pDest 3군데 대신 temp를 사용하면 약간의 성능 향상이 있을겁니다.

즐거운 하루 되세요.

김성진의 이미지

허허..

위의 변수를 하나로 수정하는 것은 웬만한 컴파일러의 optimization에 의해서

자동으로 해 줍니다.

오히려 가독성을 위해서 풀어쓰는 것을 추천하는 게 대세인듯 한데요..

최적화 하는데 제 눈에 보이는 것은

unsigned long dummySrc[SIZE] = {0,};
unsigned long dummyDst[SIZE] = {0,};

네요.

실제 위의 두 값이 읽혀지지 않기 때문에 초기화 할 필요가 없을 것 같으네요.

함수에 호출마다 초기화 코드가 수행되기 때문에 좀은 빨라지지 않을까요?

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

고도의 추상화, 극도의 구체화, 에디슨을 그리워하다.

김영현의 이미지

그냥 테스트를 위해 만든 함수입니다. 소스와 목적지를 표현해 주기 위해 살포시 넣은 것입니다. ^^;;

Timeless way of building software.

thyoo의 이미지

얼핏 산수를 해보니

   <!> destFrac = 255 - sourFrac;
 
     while (--count >= 0)
     {
         dest1 = *pDest & 0x00FF00FF;
         dest2 = *pDest & 0x0000FF00;
       <!>  dest1 = ((sour1 * sourFrac + dest1 * destFrac) >> 8) & 0x00FF00FF;

곱하기 하나를 줄일 수 있겠네요.

df = 255 - sf
 
d1 = ((s1*sf + d1*df) >> 8) & 0x00FF00FF
->
d1 = ((s1*sf + d1*(256 - sf - 1)) >> 8) & 0x00FF00FF
->
d1 = ((s1*sf + 256*d1 - d1*sf - d1) >> 8) & 0x00FF00FF
->
d1 = ((sf*(s1-d1) + (d1<<8) - d1) >> 8) & 0x00FF00FF
->
d1 = (((sf*(s1-d1)-d1)>>8) + d1) & 0x00FF00FF

___________________________________
Less is More (Robert Browning)

___________________________________
Less is More (Robert Browning)

powerc20의 이미지

죄송합니다.
실수했는데, 답글 삭제가 되지 않네요.

댓글 달기

Filtered HTML

  • 텍스트에 BBCode 태그를 사용할 수 있습니다. URL은 자동으로 링크 됩니다.
  • 사용할 수 있는 HTML 태그: <p><div><span><br><a><em><strong><del><ins><b><i><u><s><pre><code><cite><blockquote><ul><ol><li><dl><dt><dd><table><tr><td><th><thead><tbody><h1><h2><h3><h4><h5><h6><img><embed><object><param><hr>
  • 다음 태그를 이용하여 소스 코드 구문 강조를 할 수 있습니다: <code>, <blockcode>, <apache>, <applescript>, <autoconf>, <awk>, <bash>, <c>, <cpp>, <css>, <diff>, <drupal5>, <drupal6>, <gdb>, <html>, <html5>, <java>, <javascript>, <ldif>, <lua>, <make>, <mysql>, <perl>, <perl6>, <php>, <pgsql>, <proftpd>, <python>, <reg>, <spec>, <ruby>. 지원하는 태그 형식: <foo>, [foo].
  • web 주소와/이메일 주소를 클릭할 수 있는 링크로 자동으로 바꿉니다.
댓글 첨부 파일
이 댓글에 이미지나 파일을 업로드 합니다.
파일 크기는 8 MB보다 작아야 합니다.
허용할 파일 형식: txt pdf doc xls gif jpg jpeg mp3 png rar zip.
CAPTCHA
이것은 자동으로 스팸을 올리는 것을 막기 위해서 제공됩니다.