我想要做的就是利用這個代碼:如何優化
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