~bzr-pqm/bzr/bzr.dev

« back to all changes in this revision

Viewing changes to NOTES

  • Committer: John Arbash Meinel
  • Date: 2009-08-07 03:29:09 UTC
  • mto: This revision was merged to the branch mainline in revision 4613.
  • Revision ID: john@arbash-meinel.com-20090807032909-9xg0nwcqoxi9763y
Removing the min(keys) and max(keys) calls saves 100ms in the inner loop
(get_ancestry() over all of bzr.dev in a single index is 347ms => 245ms).
The current breakdown is roughly:
0.4789      0.1127   bzrlib.btree_index:1129(get_ancestry)
0.0418      0.0418   +<method 'update' of 'set' objects>
0.0480      0.0325   +bzrlib.btree_index:966(_multi_bisect_right)
0.0274      0.0274   +<method 'difference' of 'set' objects>
0.0081      0.0081   +<method 'add' of 'set' objects>
0.0075      0.0075   +<sorted>
0.0048      0.0004   +bzrlib.btree_index:899(_get_internal_nodes)
0.2275      0.0004   +bzrlib.btree_index:917(_get_leaf_nodes)
0.0002      0.0002   +<method 'extend' of 'list' objects>
0.0009      0.0001   +bzrlib.btree_index:1375(key_count)

So we have a bit of just general overhead (112ms), and then
50ms spent in _multi_bisect_right, which we could move to a C extension.
50ms in set.update and 28ms in set.difference
227ms in reading and parsing the 222 nodes from disk.
It seems a little unfortunate that parsing is the primary overhead,
but previous investigation did not reveal much fat that could be trimmed.

It is 3.8MB of uncompressed data that is being parsed. That's got to
take some amount of time. 200ms might be reasonable.
Which would hint that the only way to speed it up would be:
1) a different format
2) don't read the whole thing, stupid :)

Show diffs side-by-side

added added

removed removed

Lines of Context:
1320
1320
            all_index_missing = all_index_missing.intersection(index_missing_keys)
1321
1321
    missing_keys.update(all_index_missing)
1322
1322
    keys_to_search = keys_to_search.difference(all_index_missing)
 
1323
 
 
1324
 
 
1325
 
 
1326
Performance notes so far:
 
1327
  time ancestry_from_get_parent_map()
 
1328
  567ms
 
1329
  time ancestry_from_get_ancestry()
 
1330
  245ms
 
1331
 
 
1332
So even without optimizing that inner loop much, we are at about 43%
 
1333
time.(2.3:1 faster).
 
1334
 
 
1335
With the current setup, at the baseline, is 150ms in 222 calls to
 
1336
"_parse_leaf_lines", which is required to read all of the pages. (according to
 
1337
lsprof.)
 
1338
At best, we could shave off ~20ms by getting rid of the intern() call.
 
1339
 
 
1340
We spend 24ms in zlib.decompress
 
1341
We spend 11ms in transport.readv
 
1342
roughly 217ms in _read_nodes (under lsprof)
 
1343
 
 
1344
50ms in min() and 50ms in max(), so a much bigger savings if we fix that part.