Долго работает программа, есть ли какой-то способ ускорить работу? - C#

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

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

Листинг программы
  1. int[,] bitmap = new int[word.Width, word.Height];
  2. for (int x = 0; x < word.Width; x++)
  3. {
  4. for (int y = 0; y < word.Height; y++)
  5. {
  6. double intensity = 0.3 * word.GetPixel(x, y).R + 0.59 * word.GetPixel(x, y).G + 0.11 * word.GetPixel(x, y).B;
  7. if (intensity > 127)
  8. {
  9. bitmap[x, y] = 1;
  10. }
  11. else
  12. {
  13. bitmap[x, y] = -1;
  14. }
  15. }
  16. }
если сюда подать массив 10000*5000, то программа очень долго крутит этот цикл. есть ли какой-то способ ускорить работу? распараллелить, например? (пробовала делать Parallel.For, но почему-то вылетало). или подумываю переписать этот кусочек на с++, но будет ли толк?

Решение задачи: «Долго работает программа, есть ли какой-то способ ускорить работу?»

textual
Листинг программы
  1. using System;
  2. using System.Drawing;
  3. using System.Drawing.Imaging;
  4.  
  5. namespace CodeExamples.Drawing
  6. {
  7.     public struct PixelData
  8.     {
  9.         public byte blue;
  10.         public byte green;
  11.         public byte red;
  12.         public byte alpha;
  13.  
  14.         public PixelData(byte R, byte G, byte B)
  15.         {
  16.             blue = B;
  17.             green = G;
  18.             red = R;
  19.             alpha = 255;
  20.         }
  21.         public PixelData(byte R, byte G, byte B, byte A)
  22.         {
  23.             blue = B;
  24.             green = G;
  25.             red = R;
  26.             alpha = A;
  27.         }
  28.         public PixelData(byte A)
  29.         {
  30.             blue = A;
  31.             green = A;
  32.             red = A;
  33.             alpha = 255;
  34.         }
  35.         public PixelData(Color color)
  36.         {
  37.             blue = (byte)color.B;
  38.             green = (byte)color.G;
  39.             red = (byte)color.R;
  40.             alpha = (byte)color.A;
  41.         }
  42.  
  43.         public Color ToColor()
  44.         {
  45.             return Color.FromArgb(alpha, red, green, blue);
  46.         }
  47.     }
  48.  
  49.     public unsafe class UnsafeBitmap
  50.     {
  51.         private readonly int PixelDataSize;
  52.         private Bitmap Image;
  53.         private BitmapData ImageData;
  54.         private int Width;
  55.         private byte* DataPtr = null;
  56.  
  57.         private UnsafeBitmap()
  58.         {
  59.             PixelDataSize = sizeof(PixelData);
  60.         }
  61.  
  62.         public UnsafeBitmap(Bitmap image) : this()
  63.         {
  64.             Image = image;
  65.             LockBitmap();
  66.         }
  67.  
  68.         public void LockBitmap()
  69.         {
  70.             GraphicsUnit unit = GraphicsUnit.Pixel;
  71.             RectangleF boundsF = Image.GetBounds(ref unit);
  72.             Rectangle bounds = Rectangle.Round(boundsF);
  73.  
  74.             int width = bounds.Width * PixelDataSize;
  75.             if ((width % 4) != 0)
  76.             {
  77.                 width = 4 * (width / 4 + 1);
  78.             }
  79.             Width = width;
  80.  
  81.             BitmapData data = Image.LockBits(bounds, ImageLockMode.ReadWrite, PixelFormat.Format32bppArgb);
  82.             DataPtr = (byte*)data.Scan0.ToPointer();
  83.             ImageData = data;
  84.         }
  85.  
  86.         public Bitmap UnlockBitmap()
  87.         {
  88.             Image.UnlockBits(ImageData);
  89.             ImageData = null;
  90.             DataPtr = null;
  91.             return Image;
  92.         }
  93.  
  94.         public PixelData GetPixel(int x, int y)
  95.         {
  96.             PixelData pixel = *PixelAt(x, y);
  97.             return pixel;
  98.         }
  99.  
  100.         public void SetPixel(int x, int y, PixelData color)
  101.         {
  102.             PixelData* pixel = PixelAt(x, y);
  103.             *pixel = color;
  104.         }
  105.  
  106.         public void SetPixel(int x, int y, byte red, byte green, byte blue, byte alpha)
  107.         {
  108.             PixelData* pixel = PixelAt(x, y);
  109.             pixel->red = red;
  110.             pixel->green = green;
  111.             pixel->blue = blue;
  112.             pixel->alpha = alpha;
  113.         }
  114.  
  115.         private PixelData* PixelAt(int x, int y)
  116.         {
  117.             return (PixelData*)(DataPtr + y * Width + x * PixelDataSize);
  118.         }
  119.     }
  120.  
  121.     public static class UnsafeBitmapExample
  122.     {
  123.         public static int[,] GetIntensityMap(Bitmap source)
  124.         {
  125.             int width = source.Width;
  126.             int height = source.Height;
  127.  
  128.             int[,] intensityMap = new int[width, height];
  129.  
  130.             UnsafeBitmap bitmap = new UnsafeBitmap(source);
  131.  
  132.             for (int x = 0; x < width; ++x)
  133.             {
  134.                 for (int y = 0; y < height; ++y)
  135.                 {
  136.                     PixelData pixel = bitmap.GetPixel(x, y); // оптимизация - метод GetPixel вызывается однократно
  137.  
  138.                     double intensity = 0.3 * pixel.red + 0.59 * pixel.green + 0.11 * pixel.blue;
  139.  
  140.                     intensityMap[x, y] = (intensity > 127.0) ? 1 : -1;
  141.                 }
  142.             }
  143.  
  144.             bitmap.UnlockBitmap();
  145.  
  146.             return intensityMap;
  147.         }
  148.     }
  149. }

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


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

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

14   голосов , оценка 4.429 из 5

Нужна аналогичная работа?

Оформи быстрый заказ и узнай стоимость

Бесплатно
Оформите заказ и авторы начнут откликаться уже через 10 минут
Похожие ответы