Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/performance/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 为什么函数Color.FromValues花费了这么多时间_C#_Performance_Colors_Color Profile_Color Management - Fatal编程技术网

C# 为什么函数Color.FromValues花费了这么多时间

C# 为什么函数Color.FromValues花费了这么多时间,c#,performance,colors,color-profile,color-management,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;

写了一个关于颜色转换的小测试来使用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);
    }
uriiccuri=newuri(“C:\\temp\\AdobeRGB1998.icc”);
专用颜色AdobeColor(int r、int g、int b)
{
float[]colorValues=新浮点[3];
颜色值[0]=(浮点)r/255.0f;
颜色值[1]=(浮动)g/255.0f;
颜色值[2]=(浮动)b/255.0f;
返回Color.FromValues(colorValues,iccUri);
}
公开无效测试()
{
秒表sw=新秒表();
sw.Start();
对于(int n=0;n<10;n++)
{
颜色a=AdobeColor(n,n,n);//非常非常慢
//Color a=Color.FromRgb((字节)n,(字节)n,(字节)n);//非常快
}
sw.Stop();
时间跨度ts;
ts=经过的西南方向;
WriteLine(“结果:{0}\n”,ts.Seconds);
}

两种可能的解释:

  • Color.FromValues
    可能需要为每个调用查找ICC配置文件,这很昂贵(至少比创建一个新的简单颜色对象要贵几个数量级)
  • 如果
    Color.FromValues
    缓存配置文件,则您的特定配置文件可能存在问题,导致缓存无法工作
现在,由于
FromValues
需要磁盘访问,并且
FromRgb
是一个非常简单的算术运算,然后创建一个
Color
对象,
FromValues
将要慢几个数量级。我尝试了一个简单的基准测试,得到了:

FromValues 37.6278 ms
FromRgb     0.0029 ms

因此,至少在我的系统上,FromValues比FromRgb慢10000倍。

您是如何测量相对速度的?我看不到计时代码…对该函数的每次调用都是以秒为单位执行的!为什么不慢一点呢?你正在做的是文件IO和颜色配置文件映射,而不是简单的结构初始化。不是在相同的1000倍长!我从Adobe下载了ICC并尝试了你的代码。它似乎能够在大约40毫秒内运行测试。这还不够好吗?因为它花了所有的时间FromValues的10次迭代需要38毫秒,同样的FromRgb的10次迭代需要0.0029毫秒,使用基于您的代码的简单基准测试。每次调用我都有1.5秒。您是否在另一台机器上尝试验证?未测试时。明天结账。