【问题标题】:Why so much time does the function Color.FromValues为什么这么多时间函数 Color.FromValues
【发布时间】:2013-02-10 10:12:56
【问题描述】:

为使用 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);
    }

【问题讨论】:

  • 你是如何测量相对速度的?我看不到计时码...
  • 对这个函数的每次调用都是在几秒钟内完成的!
  • 为什么不慢一点?您正在执行文件 IO 和颜色配置文件映射与简单的结构初始化。
  • 不一样的1000倍!一个电话大约需要 1.5 秒。
  • 我从 Adob​​e 下载了 ICC 并尝试了您的代码。它似乎能够在大约 40 毫秒内运行测试。这还不够好吗?

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


【解决方案1】:

两种可能的解释:

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

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

FromValues 37.6278 ms
FromRgb     0.0029 ms

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

【讨论】:

  • 因为它花了所有时间? :)
  • FromValues 的 10 次迭代需要 38 毫秒,FromRgb 的相同 10 次迭代需要 0.0029 毫秒,并根据您的代码进行了简单的基准测试。
  • 我每次通话都有 1.5 秒的时间
  • 你在另一台机器上试过验证吗?
  • 虽然未经测试。明天检查。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-07-30
  • 1970-01-01
  • 1970-01-01
  • 2015-10-03
相关资源
最近更新 更多