2013-02-10 4 views
0

ICC 프로파일을 사용하여 색상 변환을위한 약간의 테스트를 작성했습니다. 변환 기능이 천천히 작동합니다!왜 시간이 오래 걸리나요? Color.FromValues ​​

무엇이 문제입니까?

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

어떻게 상대 속도를 측정 했습니까? 내가 타이밍 코드를 볼 수 ... –

+0

이 함수에 대한 각 호출은 초 단위로 수행됩니다! – Mixer

+2

왜 더 느리지 않습니까? 당신은 간단한 구조체 초기화 대 파일 IO 및 색상 프로파일 매핑을 수행하고 있습니다. –

답변

1

두 가지 가능한 설명 :

  • Color.FromValues (새로운 간단한 Color 객체를 만드는 것보다 적어도, 수십 배 더 비싼) 비용이 각 통화에 대한 ICC 프로파일을 조회해야 할 수도 있습니다
  • Color.FromValues이 프로필을 캐시하면 특정 프로필에 문제가있어 캐싱이 작동하지 않을 수 있습니다. FromValues 보낸 지금

은 디스크 액세스를 필요로하고, FromRgb 단일 Color 오브젝트의 작성이어서 매우 간단한 산술 연산이다 FromValues 느린 크기 순서 될 것이다. 나는 간단한 벤치 마크를 시도하고 있어요 :

FromValues 37.6278 ms 
FromRgb  0.0029 ms 

을 그래서 FromValues ​​적어도 내 시스템에, fromRGB입니다보다 약 10,000 배 느린 것 같다.

+0

그게 전부 였나요? :) – Mixer

+0

FromValues의 10 번의 반복에는 38 밀리 초가 걸리고 FromRgb의 동일한 10 번의 반복에는 0.0029ms가 소요되며 코드를 기반으로하는 간단한 벤치 마크가 있습니다. – driis

+0

매번 통화 할 때마다 1.5 초 남았습니다. – Mixer