为什么函数Color要花这么多时间.FromValues
本文关键字:时间 FromValues 函数 Color 为什么 | 更新日期: 2023-09-27 17:58:37
编写了一个关于使用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);
}
两种可能的解释:
Color.FromValues
可能需要为每个调用查找ICC配置文件,这是非常昂贵的(至少,比创建一个新的简单Color对象要贵几个数量级)- 如果
Color.FromValues
缓存配置文件,则您的特定配置文件可能存在问题,导致缓存无法工作
现在,由于FromValues
需要磁盘访问,而FromRgb
是一个非常简单的算术运算,然后创建一个Color
对象,因此FromValues
的速度将慢几个数量级。我尝试了一个简单的基准测试,得到了:
FromValues 37.6278 ms
FromRgb 0.0029 ms
因此,至少在我的系统上,FromValues似乎比FromRgb慢了大约10000倍。