我该如何优化

I'm*_*too 2 c

我正在尝试做的是采取这个代码:

char naive_smooth_descr[] = "naive_smooth: Naive baseline implementation";

void naive_smooth(int dim, pixel *src, pixel *dst) 

{

    int i, j;

    for (i = 0; i < dim; i++)
    for (j = 0; j < dim; j++)
        dst[RIDX(i, j, dim)] = avg(dim, i, j, src);
}
Run Code Online (Sandbox Code Playgroud)

并使用avg(dim, i, j, src);页面最底部的实际代码替换函数调用.然后,获取该代码并将该代码中的所有函数调用替换为实际代码等.

如果你问为什么要做这一切,原因很简单:当你摆脱函数调用时,程序运行得更快,并且当上面的代码运行时,我试图通过去掉所有的元素来获得每个元素的最快周期函数调用并用实际代码替换它.

现在我真的只是在做这件事时遇到了很多麻烦.我是否使用括号代码然后复制并粘贴?我是否遗漏了括号?例如,我是否包含代码的开头,static pixel avg(int dim, int i, int j, pixel *src)然后是括号,然后是代码来替换函数调用?

我将在这里粘贴所有代码:

/* 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 min(int a, int b) { return (a < b ? a : b); }

static int max(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) 
 */
Run Code Online (Sandbox Code Playgroud)

这是我想用以下代码替换函数调用的代码avg(dim, i, j, src);:

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 = max(i-1, 0); ii <= min(i+1, dim-1); ii++) 
    for(jj = max(j-1, 0); jj <= min(j+1, dim-1); jj++) 
         accumulate_sum(&sum, src[RIDX(ii, jj, dim)]);

    assign_sum_to_pixel(&current_pixel, sum);
    return current_pixel;


}
Run Code Online (Sandbox Code Playgroud)
/*
 * mysmooth - my smooth 
 */

char mysmooth_ descr[] = "my smooth: My smooth";

void mysmooth (int dim, pixel *src, pixel *dst) 

{    

int i, j;
int ii, jj;
pixel_sum sum;
pixel current_pixel;

for (i = 0; i < dim; i++)
for (j = 0; j < dim; j++)
{
initialize_pixel_sum(&sum);
for(ii = max(i-1, 0); ii <= min(i+1, dim-1); ii++) 
for(jj = max(j-1, 0); jj <= min(j+1, dim-1); jj++) 
    accumulate_sum(&sum, src[RIDX(ii, jj, dim)]);

assign_sum_to_pixel(&current_pixel, sum);
dst[RIDX(i, j, dim)] = current_pixel;
}
Run Code Online (Sandbox Code Playgroud)

那么这就是我从avg()获取代码并用函数替换之后我的代码应该是什么样子的?

Ash*_*win 8

如果你的代码库很小,包括10-12个函数,你可能想尝试inline在每个函数前面都有关键字.

第二个选项,使用内联所有函数调用的编译器选项,不要手动执行(这就是编译器存在的原因).你用的是什么编译器?您可以在线查看其内联所有函数调用的选项(如果有的话).

第三,如果您使用GCC编译代码,则可以指定always_inline函数的属性.以下是如何使用它:

static pixel avg (int dim, int i, int j, pixel *src) __attribute__((always_inline));
Run Code Online (Sandbox Code Playgroud)