2013-02-10 145 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