为什么函数Color.FromValues有这么多时间

时间:2013-02-10 10:12:57

标签: c# performance colors color-profile color-management

为使用ICC配置文件进行了颜色转换的一点测试。 转换功能的工作速度要慢1000倍!

有什么问题?

    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);
    }

1 个答案:

答案 0 :(得分:1)

两种可能的解释:

  • Color.FromValues可能需要为每次调用查找ICC配置文件,这很昂贵(至少比创建一个新的简单Color对象贵一个数量级)
  • 如果Color.FromValues缓存了配置文件,则您的特定配置文件可能存在问题,导致缓存无效。

现在,由于FromValues需要磁盘访问,FromRgb是一个非常简单的算术运算,然后创建一个Color对象,FromValues IS将是数量级更慢。我尝试了一个简单的基准测试并得到了:

FromValues 37.6278 ms
FromRgb     0.0029 ms

所以似乎FromValues比FromRgb慢大约10000倍,至少在我的系统上。