2011-02-18 85 views
2

我已經寫了代碼給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內執行?」

+5

通過獲得更好的機器? – 2011-02-18 07:22:53

+0

@ The Scrum Meister :)我不知道該說些什麼:P – nightWatcher 2011-02-18 07:25:20

回答

6

觀光大大提高你的代碼: -

  1. 你的「輸入」的形象始終是相同的圖像。但是每次調用Process()時都會加載它。使其成爲會員,並只加載一次。

  2. 您每次調用Process()時都會分配您的「臨時」位圖,這也不需要。使其成爲會員,並分配一次。

  3. 您不會處理任何圖形對象。當你完成它們時,位圖應該被丟棄,就像Graphics一樣。

不是一個真正的性能方面的東西,但你的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. 圖形不利於COM +。這很慢。使用WPF附帶的媒體名稱空間。

對於其餘部分;這取決於。輸入大小,機器配置(dx版本,圖形卡),C和p/invoke的技能。

1

由於你要使圖像下面的行可以被移除

g.Clear(Color.Red)的相同尺寸;

它可能沒有太大的差別,但它可以減少你的時間

1

您可能要並行運行它 - 而每個圖像仍然需要相同的時間量,你將能夠處理更多的一次(假設你有你的CPU在1個多核心)