Оптимизация кода - C# (200380)

Узнай цену своей работы

Формулировка задачи:

Добрый вечер, господа! В данный момент я пишу тулзу для демонстрации алгоритмов оценки движения и временной интерполяции и столкнулся со следующей проблемой - программа долго обрабатывает изображения.
public unsafe byte[] TimeInterpolation(int count)
        {
            
            byte[] current = new byte[Width * Height];
            Vector[] vectors = new Vector[Width * Height / 256];
            VectorInitialize(vectors, Width * Height / 256);
            //данная часть кода прогоняется несколько раз для достижения
            //наилучшего эффекта
            for (int i = 0; i < count; i++)
            {
                int W = 16;
                int H = 16;
                int cnt = 0;
                int a = 0, b = 0, min, Nmin, minA = 0, minB = 0;
                int dx, dy;
                
                for (int y = 0; y < Height; y += H)
                    for (int x = 0; x < Width; x += W)
                    {
 
                        min = 16777216;
                        a = y;
                        b = x;
                        //тут происходит "примерка" векторов из предыдущих прогонов
                        for (int V = 0; V < 8; V++)
                        {
                            if (count == 0)
                            {
                                if (y == 0 && x == 0)
                                {
                                    a = y;
                                    b = x;
                                    V = 8;
                                }
                                else if (y == 0 && x > 0)
                                {
                                    a = y + vectors[cnt - 1].y;
                                    b = x + vectors[cnt - 1].x;
                                    V = 8;
                                }
                                else if (x == Width - W)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                        V = 8;
                                    }
                                }
                                else
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt - 21].y;
                                        b = x + vectors[cnt - 21].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                        V = 8;
                                    }
                                }
                            }
                            else
                            {
                                if (y == 0 && x == 0)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt + 1].y;
                                        b = x + vectors[cnt + 1].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt + 22].y;
                                        b = x + vectors[cnt + 22].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt + 23].y;
                                        b = x + vectors[cnt + 23].x;
                                        V = 8;
                                    }
                                }
                                else if (y == 0 && x > 0 && x < Width - W)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt + 1].y;
                                        b = x + vectors[cnt + 1].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt + 21].y;
                                        b = x + vectors[cnt + 21].x;
                                    }
                                    else if (V == 3)
                                    {
                                        a = y + vectors[cnt + 22].y;
                                        b = x + vectors[cnt + 22].x;
                                    }
                                    else if (V == 4)
                                    {
                                        a = y + vectors[cnt + 23].y;
                                        b = x + vectors[cnt + 23].x;
                                        V = 8;
                                    }
                                }
                                else if (x == Width - W && y == 0)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt + 22].y;
                                        b = x + vectors[cnt + 22].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt + 21].y;
                                        b = x + vectors[cnt + 21].x;
                                        V = 8;
                                    }
                                }
                                else if (x == 0 && y < Height - H && y > 0)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt - 21].y;
                                        b = x + vectors[cnt - 21].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt + 1].y;
                                        b = x + vectors[cnt + 1].x;
                                    }
                                    else if (V == 3)
                                    {
                                        a = y + vectors[cnt + 22].y;
                                        b = x + vectors[cnt + 22].x;
                                    }
                                    else if (V == 4)
                                    {
                                        a = y + vectors[cnt + 23].y;
                                        b = x + vectors[cnt + 23].x;
                                        V = 8;
                                    }
                                }
                                else if (x == 0 && y == Height - H)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt + 1].y;
                                        b = x + vectors[cnt + 1].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt - 21].y;
                                        b = x + vectors[cnt - 21].x;
                                        V = 8;
                                    }
                                }
                                else if (x == Width - W && y > 0 && y < Height - H)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt - 23].y;
                                        b = x + vectors[cnt - 23].x;
                                    }
                                    else if (V == 3)
                                    {
                                        a = y + vectors[cnt + 22].y;
                                        b = x + vectors[cnt + 22].x;
                                    }
                                    else if (V == 4)
                                    {
                                        a = y + vectors[cnt + 21].y;
                                        b = x + vectors[cnt + 21].x;
                                        V = 8;
                                    }
                                }
                                else if (y == Height - H && x > 0 && x < Width - W)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt - 21].y;
                                        b = x + vectors[cnt - 21].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                    }
                                    else if (V == 3)
                                    {
                                        a = y + vectors[cnt - 23].y;
                                        b = x + vectors[cnt - 23].x;
                                    }
                                    else if (V == 4)
                                    {
                                        a = y + vectors[cnt + 1].y;
                                        b = x + vectors[cnt + 1].x;
                                        V = 8;
                                    }
                                }
                                else if (y == Height - H && x == Width - W)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt - 23].y;
                                        b = x + vectors[cnt - 23].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                        V = 8;
                                    }
                                }
                                else
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt - 21].y;
                                        b = x + vectors[cnt - 21].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                    }
                                    else if (V == 3)
                                    {
                                        a = y + vectors[cnt - 23].y;
                                        b = x + vectors[cnt - 23].x;
                                    }
                                    else if (V == 4)
                                    {
                                        a = y + vectors[cnt + 1].y;
                                        b = x + vectors[cnt + 1].x;
                                    }
                                    else if (V == 5)
                                    {
                                        a = y + vectors[cnt + 21].y;
                                        b = x + vectors[cnt + 21].x;
                                    }
                                    else if (V == 6)
                                    {
                                        a = y + vectors[cnt + 22].y;
                                        b = x + vectors[cnt + 22].x;
                                    }
                                    else if (V == 7)
                                    {
                                        a = y + vectors[cnt + 23].y;
                                        b = x + vectors[cnt + 23].x;
                                    }
                                }
                            }
                         
                            //тут методом градиентного спуска находятся локальные минимумы
                            //(для нас это будет самым похожим кусочком изображения(макроблоком))
                            while (true)
                            {
                                if (a + H > Height && b + W > Width)
                                    break;
                             //   if (y == 272)
                                //    MessageBox.Show("");
                                dx = b - x;
                                dy = a - y;
                                if (Check(x,y,dx,dy,W))
                                {
                                    //Nmin = SAD(preview, next, x - dx, y - dy, x + dx, y + dy);
 
                                    Nmin = 0;
                                    for (int q = 0; q < 16; q++)
                                        for (int z = 0; z < 16; z++)
                                        {
                                            Nmin += Math.Abs(preview[(q + y-dy) * 352 + z + x-dx] - 
                                                next[(q + y + dy) * 352 + z + x + dx]);
                                        }

                                    if (min > Nmin)
                                    {
                                        minA = a;
                                        minB = b;
                                        min = Nmin;
                                    }
                                }
 
                                dx = b - x;
                                dy = a - y + 1;
                                if (Check(x, y, dx, dy,W))
                                {
                                    
                                    //Nmin = SAD(preview, next, x - dx, y - dy, x + dx, y + dy);
 
                                    Nmin = 0;
                                    for (int q = 0; q < 16; q++)
                                        for (int z = 0; z < 16; z++)
                                        {
                                            Nmin += Math.Abs(preview[(q + y - dy) * 352 + z + x - dx] -
                                                next[(q + y + dy) * 352 + z + x + dx]);
                                        }
 
                                    if (min > Nmin)
                                    {
                                        minA = a + 1;
                                        minB = b;
                                        min = Nmin;
                                    }
                                }
 
                                dx = b - x;
                                dy = a - y - 1;
                                if (Check(x, y, dx, dy,W))
                                {
                                    
                                    //Nmin = SAD(preview, next, x - dx, y - dy, x + dx, y + dy);
 
                                    Nmin = 0;
                                    for (int q = 0; q < 16; q++)
                                        for (int z = 0; z < 16; z++)
                                        {
                                            Nmin += Math.Abs(preview[(q + y - dy) * 352 + z + x - dx] -
                                                next[(q + y + dy) * 352 + z + x + dx]);
                                        }

                                    if (min > Nmin)
                                    {
                                        minA = a - 1;
                                        minB = b;
                                        min = Nmin;
                                    }
                                }
 
                                dx = b - x + 1;
                                dy = a - y;
                                if (Check(x, y, dx, dy,W))
                                {
                                    
                                    //Nmin = SAD(preview, next, x - dx, y - dy, x + dx, y + dy);
 
                                    Nmin = 0;
                                    for (int q = 0; q < 16; q++)
                                        for (int z = 0; z < 16; z++)
                                        {
                                            Nmin += Math.Abs(preview[(q + y - dy) * 352 + z + x - dx] -
                                                next[(q + y + dy) * 352 + z + x + dx]);
                                        }
 
                                    if (min > Nmin)
                                    {
                                        minA = a;
                                        minB = b + 1;
                                        min = Nmin;
                                    }
                                }
 
                                dx = b - x - 1;
                                dy = a - y;
                                if (Check(x, y, dx, dy,W))
                                {
                                    
                                    //Nmin = SAD(preview, next, x - dx, y - dy, x + dx, y + dy);
 
                                    Nmin = 0;
                                    for (int q = 0; q < 16; q++)
                                        for (int z = 0; z < 16; z++)
                                        {
                                            Nmin += Math.Abs(preview[(q + y - dy) * 352 + z + x - dx] -
                                                next[(q + y + dy) * 352 + z + x + dx]);
                                        }
 
                                    if (min > Nmin)
                                    {
                                        minA = a;
                                        minB = b - 1;
                                        min = Nmin;
                                    }
                                }
                                if (a == minA && b == minB)
                                {
 
                                    if (vectors[cnt].c > min)
                                    {
                                        vectors[cnt].c = min;
                                        vectors[cnt].x = minB - x;
                                        vectors[cnt].y = minA - y;
                                        //MessageBox.Show(min.ToString());
                                    }
                                    break;
                                }
                                else
                                {
                                    a = minA;
                                    b = minB;
                                }
                            }
                        }
                        cnt++;
                    }
            }
            double tmp;
            int c = 0;
            for (int i = 0; i < Height; i+=16)
            {
                for (int j = 0; j < Width; j+=16)
                {
                    for(int q=0;q<16;q++)
                        for (int z = 0; z < 16; z++)
                        {
                            tmp = preview[((i+q) - vectors[c].y) * Width + j + z - vectors[c].x] / 2
                                + next[((i+q) + vectors[c].y) * Width + j + z + vectors[c].x] / 2 + .5;
                            if (tmp > 255)
                                tmp = 255;
                            else if (tmp < 0)
                                tmp = 0;
                            current[(i+q) * Width + z + j] = (byte)tmp;
                        }
                    c++;
                }
            }
 
            return current;
        }
Собственно, сам алгоритм рабочий. На С++ дает хорошие результаты за короткое время, но на C# где-то секунду все это делается. Вопрос в том, что можно оптимизировать? Копирование, сравнение, условные операторы? В С++ все было на указателях, здесь тоже стоит прибугнуть к небезопасному коду или есть другие варианты? Жду ваших советов, заранее спасибо.

Решение задачи: «Оптимизация кода»

textual
Листинг программы
else if (x == Width - W)
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                        V = 8;
                                    }
                                }
                                else
                                {
                                    if (V == 0)
                                    {
                                        a = y + vectors[cnt - 1].y;
                                        b = x + vectors[cnt - 1].x;
                                    }
                                    else if (V == 1)
                                    {
                                        a = y + vectors[cnt - 21].y;
                                        b = x + vectors[cnt - 21].x;
                                    }
                                    else if (V == 2)
                                    {
                                        a = y + vectors[cnt - 22].y;
                                        b = x + vectors[cnt - 22].x;
                                        V = 8;
                                    }
                                }

ИИ поможет Вам:


  • решить любую задачу по программированию
  • объяснить код
  • расставить комментарии в коде
  • и т.д
Попробуйте бесплатно

Оцени полезность:

6   голосов , оценка 4.167 из 5