【发布时间】:2014-12-06 01:07:30
【问题描述】:
这是给所有 C 专家的..
第一个函数采用一个表示图像像素的二维矩阵 src[dim][dim],并将其旋转 90 度,形成目标矩阵 dst[dim][dim]。第二个函数采用相同的 src[dim][dim] 并通过将每个像素值替换为其周围所有像素的平均值(在以该像素为中心的最大 3 × 3 窗口中)来平滑图像。
我需要考虑时间和周期来优化程序,我还能如何优化以下内容?:
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);
}
我将 dim-1-j 移到了 rotate 的内部 for 循环之外,这减少了程序中使用的时间和周期,但是还有其他东西可以用于这两个 main 函数吗?
谢谢!
【问题讨论】:
-
那么,您是在寻求帮助优化一段正常运行的代码吗?
-
是的,stackoverflow 上不允许这样做吗?我被困在还有什么可以优化的地方。认为更有经验的 C 程序员可以略读并指出明显的内容
-
用指针和简单的加法运算代替算术。例如在旋转设置一个 srcPtr 和 dstPtr。在源代码的每一行上计算指针,然后 *dstPtr = *srcPtr++; dstPtr+= 音高。这避免了每个像素的乘法等
-
克里斯,这不是 gcc 编译器自动完成的吗?
-
一些编译器有优化设置——大小或速度。检查您的文档以获取任何可用的优化设置。是的,你的问题当然是允许的,但软性答案(例如这个)和意见会很猖獗,而准确的答案很少。通过询问,我只是想确定是否有更明确的问题可以解决(具体问题)
标签: c optimization rotation pixel