我想要做的就是利用这个代码:如何优化
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(¤t_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(¤t_pixel, sum);
dst[RIDX(i, j, dim)] = current_pixel;
}
所以这是我的代码应该看起来像我完成代码后fr om avg()并用函数替换它?
你为什么要尽全力去微观优化?你从中得到什么? – 2009-10-09 13:44:21
大卫的问题尤其重要,因为通过滚动计算平均值而不是从头开始,可以使该算法更快得多。如果你是为了好玩而做这些事情,那么就自己解决吧,但是如果你真的希望代码以最小的努力跑得更快,那就用更高效的alg。 – PeterAllenWebb 2009-10-22 21:57:47