0

ICC プロファイルを使用するための色変換の簡単なテストを書きました。変換機能は1,000倍遅くなります!

どうしたの?

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

1 に答える 1

1

考えられる 2 つの説明:

  • Color.FromValues呼び出しごとに ICC プロファイルを検索する必要があるかもしれませんが、これはコストがかかります (少なくとも、新しい単純な Color オブジェクトを作成するよりも桁違いにコストがかかります)。
  • がプロファイルをキャッシュする場合Color.FromValues、特定のプロファイルに問題があり、キャッシュが機能しない可能性があります。

現在、FromValuesディスクアクセスが必要でFromRgbあり、非常に単純な算術演算とそれに続く単一のColorオブジェクトの作成であるため、FromValuesIS は桁違いに遅くなります。簡単なベンチマークを試したところ、次の結果が得られました。

FromValues 37.6278 ms
FromRgb     0.0029 ms

したがって、少なくとも私のシステムでは、FromValues は FromRgb よりも約 10000 倍遅いようです。

于 2013-02-10T10:25:53.190 に答える