有关优化此代码的任何建议吗?

时间:2011-02-18 07:17:37

标签: c# optimization

我已根据here

的答案编写了代码

我的示例代码如下

void Process(int i)
{
    input = (Bitmap)Bitmap.FromFile(@"filepath.bmp");

    Bitmap temp = new Bitmap(input.Width, input.Height, 
                             PixelFormat.Format24bppRgb);
    Graphics g = Graphics.FromImage(temp);
    g.Clear(Color.Red);
    g.DrawImage(input, Point.Empty);

    temp.Save(stream, ImageFormat.Bmp);
    //I need this stream thats further processing
}

void timer_Ex()
{
    int i = 11;
    for (; ; )
    {
      if (i == 335) break;
      else
      {
         st.Start();
         Process(i);
         st.Stop();    
         Console.WriteLine(st.ElapsedMilliseconds.ToString());
            //This time is more than the time in which thread sleeps
         st.Reset();                       
         Thread.Sleep(70);                     
         i++;
       }
   }
}

所以我试图将图像从rgb32转换为rgb24。但是处理所需的时间比线程休眠的时间要长。它只是一个示例代码。所以请帮我解决这个问题 “我如何优化进程(int i)以在20 ms或低于100 ms内执行?”

4 个答案:

答案 0 :(得分:6)

显着改善代码的事情: -

  1. 您的“输入”图片始终是相同的图片。但是每次调用Process()时都会加载它。使其成为会员,并仅加载一次。

  2. 每次调用Process()时都会分配“temp”位图,同样不需要。使其成为会员,并分配一次。

  3. 您不会丢弃任何Graphics对象。当你完成位图时应该处理位图,就像Graphics一样。

  4. 不是真正的表演,但你的for循环非常奇怪,而且难以理解。为什么要尝试重新构建内置的语言结构?

    有什么问题
    for (int i=11; i != 335 ; i++)
    {
    
         st.Start();
         Process(i);
         st.Stop();    
         Console.WriteLine(st.ElapsedMilliseconds.ToString());
            //This time is more than the time in which thread sleeps
         st.Reset();                       
         Thread.Sleep(70);   }
    

答案 1 :(得分:1)

  1. 图形针对COM +。这很慢。使用WPF附带的Media-namespace。
  2. 其余部分;这取决于。输入大小,机器配置(dx版本,显卡),使用C和p / invoke的技能。

答案 2 :(得分:1)

由于您要制作相同尺寸的图像,因此可以删除以下行

g.Clear(Color.Red);

它可能没什么区别,但可以减少你的时间

答案 3 :(得分:1)

您可能希望并行运行它 - 虽然每个图像仍然需要相同的时间,但您可以一次处理更多(假设您的CPU中有超过1个核心)