gpt4 book ai didi

c - 我该如何优化

转载 作者:行者123 更新时间:2023-12-02 05:32:19 25 4
gpt4 key购买 nike

我想做的是采用这段代码:

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);
}

并将函数调用 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)
*/

这是我要将函数调用 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;


}

/*
* 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;
}

那么,在我完成从 avg() 中获取代码并将其替换为函数后,我的代码应该是这样的吗?

最佳答案

如果您的代码库很小,包括大约 10-12 个函数,您可能想尝试在每个函数前使用关键字 inline

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

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

static pixel avg (int dim, int i, int j, pixel *src) __attribute__((always_inline));

关于c - 我该如何优化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1513090/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com