Это для всех экспертов вы C там ..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);
}
я переехал дим-1-J вне внутренней для петли вращать, что сокращает время и циклы, используемые в программе, но есть ли что-нибудь еще, что можно использовать для основной функции?
Спасибо!
Итак, вы просите о помощи, чтобы оптимизировать иначе функционирующий фрагмент кода? – ryyker
Да, что недопустимо в stackoverflow? Я застрял на том, что еще можно оптимизировать. Понятно, что более опытные программисты C могут проскальзывать через него и указать, что очевидно – Sean
Заменить арифметику указателями и простыми операциями добавления. Например, при настройке вращения выполните команду srcPtr и dstPtr. Вычислять указатели в каждой строке источника, а затем * dstPtr = * srcPtr ++; dstPtr + = шаг. Это позволяет избежать умножения и т. Д. Для каждого пикселя и т. Д. – Chris