$30 off During Our Annual Pro Sale. View Details »

Go for speed

Nick Bruun
September 18, 2014

Go for speed

A look at a use case for Go at Iconfinder, which shaved ~40 ms off asset load times.

Nick Bruun

September 18, 2014
Tweet

More Decks by Nick Bruun

Other Decks in Programming

Transcript

  1. Go for speed

    View Slide

  2. Nick Bruun
    github.com/nickbruun
    @nickbruun
    bruun.co
    CTO @ Iconfinder
    Fairly carnivorous

    View Slide

  3. View Slide

  4. View Slide

  5. View Slide

  6. Trouble in icon paradise

    View Slide

  7. View Slide

  8. View Slide

  9. View Slide

  10. View Slide

  11. 41 ms
    average response time from Django application
    during peak hours

    View Slide

  12. ~2,000 ms
    wasted per search

    View Slide

  13. Perceivably slower

    View Slide

  14. The internals

    View Slide

  15. View Slide

  16. Icon ID
    Icon version ID
    Raster size
    https://www.iconfinder.com/icons/298255/677266/128/raster
    https://cdn0.iconfinder.com/data/icons/seo-smart-pack/128/
    grey_new_seo2-43-128.png
    Public raster URL
    Protected raster URL

    View Slide

  17. View Slide

  18. Constant

    View Slide

  19. Signing requests

    View Slide

  20. https://www.iconfinder.com/icons/298255/677266/128/raster?token=…

    View Slide

  21. View Slide

  22. we know if the user has access right now
    When returning the link,

    View Slide

  23. we know if the user has access right now
    When returning the link,

    View Slide

  24. We’re okay with “right now”
    being an approximation

    View Slide

  25. Time limited token

    View Slide

  26. = "---"

    View Slide

  27. = "---"
    = hmac_sha1(, )

    View Slide

  28. = "---"
    = hmac_sha1(, )
    = "--base64()"

    View Slide

  29. But, who checks the token?

    View Slide

  30. Enter Go
    The World’s least Google-able language… from Google

    View Slide

  31. View Slide

  32. Why Go?

    View Slide

  33. Networked service

    View Slide

  34. Highly concurrent
    ~3,000 requests/second from 100 connections/core

    View Slide

  35. Low memory footprint
    14.09 MiB after 21 days

    View Slide

  36. Low CPU usage

    View Slide

  37. Static binary
    Cross-compilation = deployment heaven

    View Slide

  38. Less decisions to make

    View Slide

  39. Caveats

    View Slide

  40. Structured logging

    View Slide

  41. DIY

    View Slide

  42. Mature runtime
    !=
    Mature language

    View Slide

  43. Conciseness
    608 lines of code

    View Slide

  44. The end result

    View Slide

  45. 1.2 ms
    average response time at peak hours

    View Slide

  46. 0.1 %
    CPU usage at peak hours

    View Slide

  47. Go is awesome

    View Slide

  48. Go is awesome for simple services

    View Slide

  49. Go is a trade-off

    View Slide

  50. Go is a trade-off – choose wisely

    View Slide

  51. return

    View Slide