Skip to content

Instantly share code, notes, and snippets.

@zhongwuzw
Forked from NSProgrammer/Overview.md
Created April 19, 2019 06:55
Show Gist options
  • Star 0 You must be signed in to star a gist
  • Fork 0 You must be signed in to fork a gist
  • Save zhongwuzw/a302f2197e5516735c379ed835e6d278 to your computer and use it in GitHub Desktop.
Save zhongwuzw/a302f2197e5516735c379ed835e6d278 to your computer and use it in GitHub Desktop.
Comparing modern vs legacy graphics context rendering on iOS(AS begin to adopt render)
iPhone7,2 - Starting...
is not wide gamut screen...
iceland_P3.jpg (450x300:color=wide)
legacy: 26.20ms - 1.00:1
wide=NO: 20.79ms - 0.79:1
wide=YES: 122.64ms - 4.68:1
wide=auto-screen: 41.77ms - 1.59:1
wide=auto-image: 8.30ms - 0.32:1
iceland_sRGB.jpg (450x300)
legacy: 60.24ms - 1.00:1
wide=NO: 35.08ms - 0.58:1
wide=YES: 173.08ms - 2.87:1
wide=auto-screen: 27.56ms - 0.46:1
wide=auto-image: 16.75ms - 0.28:1
italy_P3.jpg (450x300:color=wide)
legacy: 21.04ms - 1.00:1
wide=NO: 22.93ms - 1.09:1
wide=YES: 134.23ms - 6.38:1
wide=auto-screen: 28.60ms - 1.36:1
wide=auto-image: 11.18ms - 0.53:1
italy_sRGB.jpg (450x300)
legacy: 28.71ms - 1.00:1
wide=NO: 27.95ms - 0.97:1
wide=YES: 104.61ms - 3.64:1
wide=auto-screen: 29.05ms - 1.01:1
wide=auto-image: 14.80ms - 0.52:1
parrot_wide.jpg (1350x1013:color=wide)
legacy: 165.93ms - 1.00:1
wide=NO: 151.93ms - 0.92:1
wide=YES: 1215.40ms - 7.32:1
wide=auto-screen: 150.29ms - 0.91:1
wide=auto-image: 51.58ms - 0.31:1
parrot_srgb.jpg (1350x1013)
legacy: 141.55ms - 1.00:1
wide=NO: 146.78ms - 1.04:1
wide=YES: 1105.66ms - 7.81:1
wide=auto-screen: 131.08ms - 0.93:1
wide=auto-image: 53.42ms - 0.38:1
shoes_adobeRGB.jpg (450x300:color=wide)
legacy: 20.93ms - 1.00:1
wide=NO: 21.05ms - 1.01:1
wide=YES: 117.91ms - 5.63:1
wide=auto-screen: 20.83ms - 1.00:1
wide=auto-image: 8.98ms - 0.43:1
shoes_sRGB.jpg (450x300)
legacy: 21.08ms - 1.00:1
wide=NO: 18.94ms - 0.90:1
wide=YES: 97.56ms - 4.63:1
wide=auto-screen: 18.61ms - 0.88:1
wide=auto-image: 8.31ms - 0.39:1
webkit_P3.png (750x750:color=wide)
legacy: 101.35ms - 1.00:1
wide=NO: 97.47ms - 0.96:1
wide=YES: 635.97ms - 6.28:1
wide=auto-screen: 131.62ms - 1.30:1
wide=auto-image: 54.76ms - 0.54:1
webkit_sRGB.png (750x750)
legacy: 53.36ms - 1.00:1
wide=NO: 52.49ms - 0.98:1
wide=YES: 402.90ms - 7.55:1
wide=auto-screen: 53.95ms - 1.01:1
wide=auto-image: 26.15ms - 0.49:1
Complete!
iPhone7,2 - Starting...
is not wide gamut screen...
iceland_P3.jpg (450x300:color=wide)
legacy: 17.50ms - 1.00:1
wide=NO: 13.35ms - 0.76:1
wide=YES: 74.33ms - 4.25:1
wide=auto-screen: 13.15ms - 0.75:1
wide=auto-image: 5.24ms - 0.30:1
iceland_sRGB.jpg (450x300)
legacy: 11.87ms - 1.00:1
wide=NO: 11.93ms - 1.01:1
wide=YES: 61.45ms - 5.18:1
wide=auto-screen: 12.36ms - 1.04:1
wide=auto-image: 4.94ms - 0.42:1
italy_P3.jpg (450x300:color=wide)
legacy: 13.38ms - 1.00:1
wide=NO: 13.50ms - 1.01:1
wide=YES: 74.73ms - 5.58:1
wide=auto-screen: 13.67ms - 1.02:1
wide=auto-image: 5.56ms - 0.42:1
italy_sRGB.jpg (450x300)
legacy: 12.16ms - 1.00:1
wide=NO: 12.39ms - 1.02:1
wide=YES: 61.96ms - 5.09:1
wide=auto-screen: 12.31ms - 1.01:1
wide=auto-image: 5.38ms - 0.44:1
parrot_wide.jpg (1350x1013:color=wide)
legacy: 95.58ms - 1.00:1
wide=NO: 88.44ms - 0.93:1
wide=YES: 696.05ms - 7.28:1
wide=auto-screen: 88.91ms - 0.93:1
wide=auto-image: 30.66ms - 0.32:1
parrot_srgb.jpg (1350x1013)
legacy: 83.50ms - 1.00:1
wide=NO: 75.68ms - 0.91:1
wide=YES: 561.13ms - 6.72:1
wide=auto-screen: 76.05ms - 0.91:1
wide=auto-image: 30.65ms - 0.37:1
shoes_adobeRGB.jpg (450x300:color=wide)
legacy: 14.13ms - 1.00:1
wide=NO: 14.10ms - 1.00:1
wide=YES: 73.87ms - 5.23:1
wide=auto-screen: 14.26ms - 1.01:1
wide=auto-image: 6.65ms - 0.47:1
shoes_sRGB.jpg (450x300)
legacy: 13.12ms - 1.00:1
wide=NO: 13.44ms - 1.02:1
wide=YES: 61.95ms - 4.72:1
wide=auto-screen: 12.91ms - 0.98:1
wide=auto-image: 5.95ms - 0.45:1
webkit_P3.png (750x750:color=wide)
legacy: 62.37ms - 1.00:1
wide=NO: 59.27ms - 0.95:1
wide=YES: 356.34ms - 5.71:1
wide=auto-screen: 58.93ms - 0.94:1
wide=auto-image: 31.31ms - 0.50:1
webkit_sRGB.png (750x750)
legacy: 32.29ms - 1.00:1
wide=NO: 32.42ms - 1.00:1
wide=YES: 244.65ms - 7.58:1
wide=auto-screen: 35.65ms - 1.10:1
wide=auto-image: 16.07ms - 0.50:1
Complete!
iPhone9,3 - Starting...
is wide gamut screen...
iceland_P3.jpg (450x300:color=wide)
legacy: 14.53ms - 1.00:1
wide=NO: 9.25ms - 0.64:1
wide=YES: 28.23ms - 1.94:1
wide=auto-screen: 27.48ms - 1.89:1
wide=auto-image: 3.32ms - 0.23:1
iceland_sRGB.jpg (450x300)
legacy: 5.35ms - 1.00:1
wide=NO: 5.35ms - 1.00:1
wide=YES: 21.34ms - 3.99:1
wide=auto-screen: 21.66ms - 4.04:1
wide=auto-image: 2.81ms - 0.52:1
italy_P3.jpg (450x300:color=wide)
legacy: 6.00ms - 1.00:1
wide=NO: 5.78ms - 0.96:1
wide=YES: 26.35ms - 4.39:1
wide=auto-screen: 27.19ms - 4.53:1
wide=auto-image: 3.29ms - 0.55:1
italy_sRGB.jpg (450x300)
legacy: 5.26ms - 1.00:1
wide=NO: 5.27ms - 1.00:1
wide=YES: 21.90ms - 4.16:1
wide=auto-screen: 20.97ms - 3.99:1
wide=auto-image: 2.61ms - 0.50:1
parrot_wide.jpg (1350x1013:color=wide)
legacy: 62.48ms - 1.00:1
wide=NO: 60.56ms - 0.97:1
wide=YES: 270.58ms - 4.33:1
wide=auto-screen: 245.49ms - 3.93:1
wide=auto-image: 13.54ms - 0.22:1
parrot_srgb.jpg (1350x1013)
legacy: 34.88ms - 1.00:1
wide=NO: 30.80ms - 0.88:1
wide=YES: 192.09ms - 5.51:1
wide=auto-screen: 187.60ms - 5.38:1
wide=auto-image: 13.66ms - 0.39:1
shoes_adobeRGB.jpg (450x300:color=wide)
legacy: 5.91ms - 1.00:1
wide=NO: 6.49ms - 1.10:1
wide=YES: 27.86ms - 4.71:1
wide=auto-screen: 28.11ms - 4.76:1
wide=auto-image: 4.42ms - 0.75:1
shoes_sRGB.jpg (450x300)
legacy: 5.97ms - 1.00:1
wide=NO: 6.03ms - 1.01:1
wide=YES: 21.95ms - 3.68:1
wide=auto-screen: 21.75ms - 3.64:1
wide=auto-image: 3.58ms - 0.60:1
webkit_P3.png (750x750:color=wide)
legacy: 30.63ms - 1.00:1
wide=NO: 29.46ms - 0.96:1
wide=YES: 124.92ms - 4.08:1
wide=auto-screen: 124.80ms - 4.07:1
wide=auto-image: 18.65ms - 0.61:1
webkit_sRGB.png (750x750)
legacy: 13.52ms - 1.00:1
wide=NO: 12.67ms - 0.94:1
wide=YES: 78.95ms - 5.84:1
wide=auto-screen: 81.77ms - 6.05:1
wide=auto-image: 7.29ms - 0.54:1
Complete!

legacy = UIGraphicsBeginImageContextWithOptions + UIGraphicsEndImageContext

modern = UIGraphicsImageRendererFormat + UIGraphicsImageRenderer

Take aways:

  • "modern" w/ prefersExtendedRange = NO

    • basically the same perf as "legacy"
    • probably a good idea to adopt since optimizations will likely be in "modern" first
  • "modern" w/ prefersExtendedRange = YES

    • always slower
    • between 6 and 9 times slower on actual devices
    • usually 20 times slower on simulator (saw 25x regularly in unit tests)
  • "modern" w/ prefersExtendedRange = auto-screen

    • basically, screens with wide gamut will bucket into YES and others will be NO
  • images w/ wide gamut colorspace

    • the image being rendered having wide gamut colorspace or not had no impact on perf
    • this seems like an easy optimization that UIKit could add, if the image is not wide gamut, why apply it? The flag is "prefers" extended range after all.
  • reusing the renderer

    • this had no impact on performance at all
    • the reuse is limited to outputing to the same sized image too, which makes reuse only viable for certain use cases
  • NEW INFO UIImage offers the optimal imageRendererFormat (tested as auto-image)

    • This runs roughly 50% faster than the legacy formatter

Recommendation:

  • Devs should use legacy on iOS 9 and older
  • Devs should use defaultFormat (iOS 10) or preferredFormat (iOS 11) when creating the UIGraphicsImageRendererFormat
  • Devs should set prefersExtendedRange to NO when the image being rendered is not wide gamut (otherwise, leave prefersExtendedRange as the default/auto value)
  • Devs should use the imageRendererFormat sourced directly from the UIImage being scaled/modified/rendered. It is optimal.

Tests:

x86_64 - Starting...
is not wide gamut screen...
iceland_P3.jpg (450x300:color=wide)
legacy: 5.87ms - 1.00:1
wide=NO: 5.03ms - 0.86:1
wide=YES: 99.77ms - 16.99:1
wide=auto-screen: 5.67ms - 0.97:1
wide=auto-image: 1.99ms - 0.34:1
iceland_sRGB.jpg (450x300)
legacy: 4.87ms - 1.00:1
wide=NO: 4.41ms - 0.90:1
wide=YES: 92.64ms - 19.02:1
wide=auto-screen: 4.89ms - 1.00:1
wide=auto-image: 1.38ms - 0.28:1
italy_P3.jpg (450x300:color=wide)
legacy: 5.39ms - 1.00:1
wide=NO: 5.22ms - 0.97:1
wide=YES: 101.08ms - 18.76:1
wide=auto-screen: 5.32ms - 0.99:1
wide=auto-image: 2.33ms - 0.43:1
italy_sRGB.jpg (450x300)
legacy: 5.14ms - 1.00:1
wide=NO: 4.86ms - 0.94:1
wide=YES: 94.68ms - 18.40:1
wide=auto-screen: 4.07ms - 0.79:1
wide=auto-image: 1.38ms - 0.27:1
parrot_wide.jpg (1350x1013:color=wide)
legacy: 50.84ms - 1.00:1
wide=NO: 44.40ms - 0.87:1
wide=YES: 936.88ms - 18.43:1
wide=auto-screen: 42.97ms - 0.85:1
wide=auto-image: 15.79ms - 0.31:1
parrot_srgb.jpg (1350x1013)
legacy: 42.40ms - 1.00:1
wide=NO: 40.45ms - 0.95:1
wide=YES: 900.55ms - 21.24:1
wide=auto-screen: 37.76ms - 0.89:1
wide=auto-image: 15.45ms - 0.36:1
shoes_adobeRGB.jpg (450x300:color=wide)
legacy: 4.94ms - 1.00:1
wide=NO: 4.34ms - 0.88:1
wide=YES: 91.95ms - 18.61:1
wide=auto-screen: 5.75ms - 1.16:1
wide=auto-image: 2.12ms - 0.43:1
shoes_sRGB.jpg (450x300)
legacy: 4.66ms - 1.00:1
wide=NO: 4.28ms - 0.92:1
wide=YES: 91.77ms - 19.67:1
wide=auto-screen: 4.11ms - 0.88:1
wide=auto-image: 1.70ms - 0.36:1
webkit_P3.png (750x750:color=wide)
legacy: 33.74ms - 1.00:1
wide=NO: 31.38ms - 0.93:1
wide=YES: 503.14ms - 14.91:1
wide=auto-screen: 31.73ms - 0.94:1
wide=auto-image: 10.67ms - 0.32:1
webkit_sRGB.png (750x750)
legacy: 15.82ms - 1.00:1
wide=NO: 15.60ms - 0.99:1
wide=YES: 317.74ms - 20.08:1
wide=auto-screen: 15.72ms - 0.99:1
wide=auto-image: 10.51ms - 0.66:1
Complete!
x86_64 - Starting...
is wide gamut screen...
iceland_P3.jpg (450x300:color=wide)
legacy: 6.01ms - 1.00:1
wide=NO: 5.76ms - 0.96:1
wide=YES: 105.67ms - 17.59:1
wide=auto-screen: 103.06ms - 17.16:1
wide=auto-image: 1.66ms - 0.28:1
iceland_sRGB.jpg (450x300)
legacy: 4.15ms - 1.00:1
wide=NO: 3.88ms - 0.93:1
wide=YES: 101.71ms - 24.52:1
wide=auto-screen: 92.93ms - 22.40:1
wide=auto-image: 1.36ms - 0.33:1
italy_P3.jpg (450x300:color=wide)
legacy: 5.21ms - 1.00:1
wide=NO: 4.93ms - 0.95:1
wide=YES: 111.45ms - 21.37:1
wide=auto-screen: 96.83ms - 18.57:1
wide=auto-image: 1.79ms - 0.34:1
italy_sRGB.jpg (450x300)
legacy: 4.87ms - 1.00:1
wide=NO: 4.25ms - 0.87:1
wide=YES: 98.09ms - 20.15:1
wide=auto-screen: 110.31ms - 22.66:1
wide=auto-image: 2.13ms - 0.44:1
parrot_wide.jpg (1350x1013:color=wide)
legacy: 61.21ms - 1.00:1
wide=NO: 61.82ms - 1.01:1
wide=YES: 1031.19ms - 16.85:1
wide=auto-screen: 1089.97ms - 17.81:1
wide=auto-image: 22.65ms - 0.37:1
parrot_srgb.jpg (1350x1013)
legacy: 60.11ms - 1.00:1
wide=NO: 56.79ms - 0.94:1
wide=YES: 1103.17ms - 18.35:1
wide=auto-screen: 1031.96ms - 17.17:1
wide=auto-image: 17.22ms - 0.29:1
shoes_adobeRGB.jpg (450x300:color=wide)
legacy: 5.56ms - 1.00:1
wide=NO: 4.99ms - 0.90:1
wide=YES: 99.63ms - 17.93:1
wide=auto-screen: 108.37ms - 19.50:1
wide=auto-image: 2.22ms - 0.40:1
shoes_sRGB.jpg (450x300)
legacy: 5.40ms - 1.00:1
wide=NO: 4.94ms - 0.91:1
wide=YES: 101.59ms - 18.81:1
wide=auto-screen: 92.44ms - 17.11:1
wide=auto-image: 1.81ms - 0.33:1
webkit_P3.png (750x750:color=wide)
legacy: 28.15ms - 1.00:1
wide=NO: 25.93ms - 0.92:1
wide=YES: 532.16ms - 18.90:1
wide=auto-screen: 526.92ms - 18.72:1
wide=auto-image: 11.47ms - 0.41:1
webkit_sRGB.png (750x750)
legacy: 16.46ms - 1.00:1
wide=NO: 16.64ms - 1.01:1
wide=YES: 346.30ms - 21.05:1
wide=auto-screen: 357.19ms - 21.71:1
wide=auto-image: 10.91ms - 0.66:1
Complete!
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment