Commit 662908b5 authored by Raymond Hettinger's avatar Raymond Hettinger

Restore the data block size to 62.

The former block size traded away good fit within cache lines in
order to gain faster division in deque_item().  However, compilers
are getting smarter and can now replace the slow division operation
with a fast integer multiply and right shift.  Accordingly, it makes
sense to go back to a size that lets blocks neatly fill entire
cache-lines.

GCC-4.8 and CLANG 4.0 both compute "x // 62" with something
roughly equivalent to "x * 9520900167075897609 >> 69".
parent 16b10c64
......@@ -522,7 +522,7 @@ class TestBasic(unittest.TestCase):
@test_support.cpython_only
def test_sizeof(self):
BLOCKLEN = 64
BLOCKLEN = 62
basesize = test_support.calcobjsize('2P4PlP')
blocksize = struct.calcsize('2P%dP' % BLOCKLEN)
self.assertEqual(object.__sizeof__(deque()), basesize)
......
......@@ -10,11 +10,14 @@
/* The block length may be set to any number over 1. Larger numbers
* reduce the number of calls to the memory allocator, give faster
* indexing and rotation, and reduce the link::data overhead ratio.
* Ideally, the block length should be a power-of-two for faster
* division/modulo computations during indexing.
*
* Ideally, the block length will be set to two less than some
* multiple of the cache-line length (so that the full block
* including the leftlink and rightlink will fit neatly into
* cache lines).
*/
#define BLOCKLEN 64
#define BLOCKLEN 62
#define CENTER ((BLOCKLEN - 1) / 2)
/* A `dequeobject` is composed of a doubly-linked list of `block` nodes.
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment