Give your pony wings
Benjamin Wohlwend
@piquadrat_ch
slides - https://speakerdeck.com/piquadrat/make-your-pony-fly
- I like my code to be lazy
- Making your code not do too much work makes your code faster
- make a stackoverflow clone - for pony owners
- use Django - models for Question, Answer, Tag, User ...
- views for QuestionList, QuestionView
- templates ...
- go live - happy until ...
- someone linked from ponynews and
- we have a performance problem (or maybe several problems)
- so how do you find the issues
- django-debug-toolbar, django-dev-server, ...
- django-debug-toolbar is great - lots of features - SQL queries shown - hundreds of queries for one page
- django-devserver - shows number of sql queries, number of duplicates, time for request
The big three
- reduce database queries
- do less work
- if all else fails - cache
Less SQL queries
- select_related()
- use to preload objects referenced by ForeignKey
- eg looking up user in template
- prefetch_related()
- similar for reverse ForeignKey and ManyToMany
- so get all tags for all questions in one query
Overall, go from 121 queries to 3 queries!
Do less work
- move work out of request/response cycle (eg celery)
- only fetch data that we need - QuerySet.defer() can skip unneeded large columns (or only())
- let others do the work (eg do calculations in the database with annotate/aggregate)
Caching
- doing properly gives you great scaling
- but cache invalidation is really hard
- can also make code hard to test and understand
- so recommend only use it when necessary
- cache_page decorator - put it on view - timeout
- template caching with {% cache %}
- ORM caching with jonny-cache or django-cache-machine
- caching http proxy like Varnish
Much more in book - High Performance Django