2013-02-10 31 views
0

這麼多時間寫了一個顏色轉換爲ICC配置文件的測試。 轉換功能工作速度慢1000倍!爲什麼功能Color.FromValues

有什麼問題?

Uri iccUri = new Uri("C:\\temp\\AdobeRGB1998.icc"); 
    private Color AdobeColor(int r, int g, int b) 
    { 
     float[] colorValues = new float[3]; 
     colorValues[0] = (float)r/255.0f; 
     colorValues[1] = (float)g/255.0f; 
     colorValues[2] = (float)b/255.0f; 
     return Color.FromValues(colorValues,iccUri); 
    } 

    public void Test() 
    { 
     Stopwatch sw = new Stopwatch(); 
     sw.Start(); 
     for (int n = 0; n < 10; n++) 
     { 
      Color a = AdobeColor(n, n, n);//very very slow 
      //Color a = Color.FromRgb((byte)n, (byte)n, (byte)n);//very fast 

     } 

     sw.Stop(); 
     TimeSpan ts; 
     ts = sw.Elapsed; 
     Console.WriteLine("result: {0}\n", ts.Seconds); 
    } 
+2

你是如何測量相對速度的?我看不到任何時間代碼... – 2013-02-10 10:14:06

+0

每次調用此函數都會在幾秒鐘內完成! – Mixer 2013-02-10 10:21:44

+2

爲什麼它不會變慢?你正在做文件IO和顏色配置文件映射與簡單的結構初始化。 – 2013-02-10 10:24:26

回答

1

兩種可能的解釋:

  • Color.FromValues可能需要查找每個呼叫,這是昂貴的(不是創建一個新的簡單的Color對象至少,數量級更貴)的ICC配置文件
  • 如果Color.FromValues緩存配置文件,那麼您的特定配置文件可能有問題,導致緩存不起作用。

現在,由於FromValues需要磁盤訪問,並FromRgb是一個非常簡單的算術運算,然後創建一個單一的Color對象,FromValues將是數量級的速度較慢。我嘗試了簡單的基準,並得到:

FromValues 37.6278 ms 
FromRgb  0.0029 ms 

如此看來,FromValues比FromRgb慢約10000次,至少在我的系統。

+0

在那花了所有的時間? :) – Mixer 2013-02-10 10:48:49

+0

10次迭代的FromValues需要38毫秒,同樣10次迭代的FromRgb需要0.0029 ms,並根據您的代碼進行簡單的基準測試。 – driis 2013-02-10 10:50:51

+0

每次通話都有1.5秒 – Mixer 2013-02-10 10:54:15