[Rd] [FORGED] grDevices::convertColor and colorRamp(space='Lab') Performance Improvements
Paul Murrell
p@ul @ending from @t@t@@uckl@nd@@c@nz
Thu Oct 4 00:09:10 CEST 2018
Thanks Brodie. Having a look at all of this is on my list.
Paul
On 03/10/18 14:13, Brodie Gaslam via R-devel wrote:
> `grDevices::convertColor` performance can be improved by 30-300x with
> small changes to the code. `colorRamp(space='Lab')` uses `convertColor`
> so it too benefits from substantial performance gains.
>
> `convertColor` vectorizes explicitly over the rows of the input color
> matrix using `apply`. The level-1 patch [1] illustrates a possible
> minimal set of changes to achieve this with just R matrix and vector
> operations. The changes consist primarily of switching `if/else` to
> `ifelse`, `c` to `cbind`, `sum` to `rowSums`, etc. This results in
> speedups of 30-100x as shown in table 1:
>
> to
> from Apple RGB sRGB CIE RGB XYZ Lab Luv
> Apple RGB NA 38.3 55.8 30.3 60.2 56.3
> sRGB 38.7 NA 55.7 36.5 62.9 52.7
> CIE RGB 45.2 44.4 NA 30.6 51.5 43.1
> XYZ 73.4 57.5 69.1 NA 92.2 69.0
> Lab 46.6 56.6 65.4 72.0 NA 61.3
> Luv 73.2 107.3 67.3 105.8 97.8 NA
>
> ## Table 1:
> ## Ratios of `grDevices` to 'level-1' patch speeds for 8000 colors
> ## from each supported color space to all other supported color spaces.
>
> A few incremental changes as detailed in the level-2 patch [2] yield
> additional performance improvements:
>
> to
> from Apple RGB sRGB CIE RGB XYZ Lab Luv
> Apple RGB NA 97.1 106.2 89.0 117 83.4
> sRGB 92.5 NA 99.4 86.4 120 76.0
> CIE RGB 119.2 184.2 NA 82.2 135 83.4
> XYZ 122.3 209.8 140.9 NA 171 148.8
> Lab 166.4 168.2 255.4 288.5 NA 265.1
> Luv 141.7 173.6 279.6 310.1 195 NA
>
> ## Table 2:
> ## Ratios of `grDevices` to level-2 patch speeds for 8000 colors
> ## from each supported color space to all other supported color spaces.
>
> Not shown here is that the patched versions of `convertColor` are faster
> with small inputs as well, though the difference is less marked.
>
> I have posted tests on github [3], along with the results of running
> them on my system [4]. While these tests are not proof that the patches
> do not change the function other than to make it faster, the tests
> results combined with the narrow scope of the changes hopefully provides
> sufficient evidence this is the case. For those wanting to run the
> tests, installation and testing instructions are on the github landing
> page for this project [5].
>
> There are some minor (in my opinion) changes in behavior that need to be
> discussed:
>
> * Inputs that would previously stop with errors or work inconsistently
> now work consistently (e.g. zero-row inputs or inputs containing
> NA/NaN/Inf).
> * Column names are consistently set to the color space initials; these
> were previously inconsistently set / mangled by `c`.
>
> These are discussed at length with examples in [6].
>
> It would be possible to preserve the existing behavior, but doing so
> would require some contortions that serve no other purposes than that.
> Additionally, in many cases the existing behavior is inconsistent across
> different input/output color spaces. Finally, most of the differences
> involve corner case inputs such as those containing NA/NaN/Inf, or zero
> rows.
>
> I am entirely amenable to modify the patches to preserve existing
> behavior in these cases if that is considered desirable.
>
> These patches should be coordinated with #17473 [7], which I found while
> working on this issue.
>
> -----------------------------------------------
>
> 'level-1' patch:
> [1]:
> https://raw.githubusercontent.com/brodieG/grDevices2/level-2/extra/level-1.txt
>
>
> 'level-2' patch:
> [2]:
> https://raw.githubusercontent.com/brodieG/grDevices2/level-2/extra/level-2.txt
>
>
> Tests on github, and the result of running them:
> [3]:
> https://github.com/brodieG/grDevices2/blob/level-2/tests/convertColor.R
> [4]:
> https://raw.githubusercontent.com/brodieG/grDevices2/level-2/tests/convertColor.Rout
>
>
> Github landing page for this project:
> [5]: https://github.com/brodieG/grDevices2
>
> Discussion of differences introduces by patches:
> [6]:
> https://htmlpreview.github.io/?https://raw.githubusercontent.com/brodieG/grDevices2/level-2/extra/differences.html
>
>
> Indirectly related bugzilla issue #17473:
> [7]: https://bugs.r-project.org/bugzilla/show_bug.cgi?id=17473
>
> ______________________________________________
> R-devel using r-project.org mailing list
> https://stat.ethz.ch/mailman/listinfo/r-devel
--
Dr Paul Murrell
Department of Statistics
The University of Auckland
Private Bag 92019
Auckland
New Zealand
64 9 3737599 x85392
paul using stat.auckland.ac.nz
http://www.stat.auckland.ac.nz/~paul/
More information about the R-devel
mailing list