과연 이코드에 최적화할 틈이 있을 까요??
#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 관련 그리기 함수(알파 블렌딩) 입니다. 어셈으로도 뽑아 보고, 이것 저것 웹도 뒤져보고 했는데... 제가 생각할 때는 틈이 없는 듯 합니다. 코드의 논리적인 부분은 바꾸지 않고 단순히 기교(꼼수) 만으로 성능을 향살 시킬 수 있을 까요? ㅠ_ㅠ
loop
loop unrolling이요.
안해보셨다면 해보세요.
http://www.lysator.liu.se/c/duffs-device.html
--
Passion is like genius; a miracle.
--
Passion is like genius; a miracle.
Logic 안바꾸고 최적화
Logic 안바꾸고 최적화 할라믄..
local 변수 전역으로 바꿔보세요.
UI refresh면 상당히 많이 불릴텐데 불릴때마다 지역변수 잡고 불리고 해제하는 과정또한 overhead가 되겠네요.
변수가 전역으로
변수가 전역으로 선언된다면 이 변수는 메모리 상에 위치하게 됩니다.
메모리에 저장되어 있는 값보다 레지스터에 저장되어 있는 값을 읽고 쓰는것이 훨씬 빠릅니다.
메모리에서 읽고 쓰는 작업을 줄이기위해 지역변수가 레지스터에 할당 되는게 더 좋습니다.
"지역변수 잡고 불리고 해제하는 과정의 오버헤드"는 거의 없다고 보셔도 됩니다.
더 정확히는 범용으로 사용할 수 있는 레지스터 14개 안에서 지역변수가 사용된다는 조건하에서 그렇겠죠.
------------------------------

loop안에서 *pDest 이
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.
얼핏 산수를
얼핏 산수를 해보니
곱하기 하나를 줄일 수 있겠네요.
___________________________________
Less is More (Robert Browning)
___________________________________
Less is More (Robert Browning)
-----------------------------
죄송합니다.
실수했는데, 답글 삭제가 되지 않네요.
댓글 달기