이것은C 사진 회전 최적화
첫번째 기능은 화상의 화소를 나타내는 이차원 매트릭스 SRC [절전] [어둡게]를 얻어 .. 밖에 뷔페 C 전문가위한 것이며으로 90도 회전 목적지 행렬 dst [dim] [dim]. 두 번째 함수는 동일한 src [dim] [dim]을 사용하고 모든 픽셀 값을 주변 모든 픽셀의 평균 (해당 픽셀을 중심으로하는 최대 3x3 창)으로 대체하여 이미지를 매끄럽게 만듭니다.
내가 시간과주기 위해 계정에서 프로그램을 최적화하는 데 필요한, 어떻게 다른 내가
void rotate(int dim, pixel *src, pixel *dst,)
{
int i, j, nj;
nj = 0;
/* below are the main computations for the implementation of rotate. */
for (j = 0; j < dim; j++) {
nj = dim-1-j; /* Code Motion moved operation outside inner for loop */
for (i = 0; i < dim; i++) {
dst[RIDX(nj, i, dim)] = src[RIDX(i, j, dim)];
}
}
}
/* A struct used to compute averaged pixel value */
typedef struct {
int red;
int green;
int blue;
int num;
} pixel_sum;
/* Compute min and max of two integers, respectively */
static int minimum(int a, int b)
{ return (a < b ? a : b); }
static int maximum(int a, int b)
{ return (a > b ? a : b); }
/*
* initialize_pixel_sum - Initializes all fields of sum to 0
*/
static void initialize_pixel_sum(pixel_sum *sum)
{
sum->red = sum->green = sum->blue = 0;
sum->num = 0;
return;
}
/*
* accumulate_sum - Accumulates field values of p in corresponding
* fields of sum
*/
static void accumulate_sum(pixel_sum *sum, pixel p)
{
sum->red += (int) p.red;
sum->green += (int) p.green;
sum->blue += (int) p.blue;
sum->num++;
return;
}
/*
* assign_sum_to_pixel - Computes averaged pixel value in current_pixel
*/
static void assign_sum_to_pixel(pixel *current_pixel, pixel_sum sum)
{
current_pixel->red = (unsigned short) (sum.red/sum.num);
current_pixel->green = (unsigned short) (sum.green/sum.num);
current_pixel->blue = (unsigned short) (sum.blue/sum.num);
return;
}
/*
* avg - Returns averaged pixel value at (i,j)
*/
static pixel avg(int dim, int i, int j, pixel *src)
{
int ii, jj;
pixel_sum sum;
pixel current_pixel;
initialize_pixel_sum(&sum);
for(ii = maximum(i-1, 0); ii <= minimum(i+1, dim-1); ii++)
for(jj = maximum(j-1, 0); jj <= minimum(j+1, dim-1); jj++)
accumulate_sum(&sum, src[RIDX(ii, jj, dim)]);
assign_sum_to_pixel(¤t_pixel, sum);
return current_pixel;
}
void smooth(int dim, pixel *src, pixel *dst)
{
int i, j;
/* below are the main computations for the implementation of the smooth function. */
for (j = 0; j < dim; j++)
for (i = 0; i < dim; i++)
dst[RIDX(i, j, dim)] = avg(dim, i, j, src);
}
? 다음 내가 루프에 대한 내부의 바깥 어두운-1-J를 이동 최적화 할 수있을 것입니다 rotate는 프로그램에서 사용되는 시간과 사이클을 줄이지 만, main 함수에 사용할 수있는 다른 함수가 있습니까?
감사합니다.
그렇다면 제대로 작동하는 코드를 최적화하는 데 도움을 청하고 있습니까? – ryyker
예, stackoverflow에 허용되지 않습니까? 나는 다른 무엇을 최적화 할 수에 붙어있다. 더 숙련 된 C 프로그래머가 그것을 훑어보고 무엇이 명백한지를 지적 할 수 있습니다. – Sean
산술을 포인터와 간단한 추가 연산으로 대체하십시오. 예를 들어, 회전 설정에서 srcPtr과 dstPtr. 소스의 각 행에 대한 Calc 포인터 * dstPtr = * srcPtr ++; dstPtr + = 피치. 이것은 각 픽셀에 대한 곱셈 등을 피합니다. – Chris