Improve the speed of datagrid rendering.

Review Request #1483 — Created March 24, 2010 and submitted

Information

Djblets
master

Reviewers

Improve the speed of datagrid rendering.

An earlier change drastically reduced query times by reducing the number of
queries made and cached object lookups, but datagrid rendering was still slow
due to the number of template loads and renders.

We now do a few things to speed up rendering.

1) We now load a cell template and parse it only once, instead of once per
   cell. Much of our time was spent in parsing the same template file over
   and over. By caching this parsed Template object and using it for all cells
   we have to render, we drastically cut down on the render time.

2) We do the same for header templates as well. This takes up far less time
   than cell template parsing, but is still a savings.

3) We keep a cached render of every distinct cell for the lifetime of the
   datagrid render. This means that if 20 cells all render the name of a
   User, we will only render that cell once, and pull it from the cache the
   19 other times.

4) While not datagrid-specific, the feedview app now imports feedparser only
   when needed. On my tests here, feedparser took a quarter of a second to
   load, so this is a decent savings.

All in all, on my test with 16 rows of 8 columns, this reduced load time
of the Review Board dashboard by just over a second. Larger datagrids should
get a proportional savings.
Tested this on my own internal test database and on a replica of the database on reviews.reviewboard.org. It was noticeably faster in both cases.
david
  1. Nice. I wonder if it might be worth poking into Django's innards to cache all templates after they're loaded.
  2.