(original) (raw)
changeset: 84116:5accb0ac8bfb branch: 2.7 parent: 84095:ca8e86711403 user: Raymond Hettinger python@rcn.com date: Fri Jun 14 01:06:33 2013 -0400 files: Lib/test/test_deque.py Modules/_collectionsmodule.c description: Fix comment blocks. Adjust blocksize to a power-of-two for better divmod computations. diff -r ca8e86711403 -r 5accb0ac8bfb Lib/test/test_deque.py --- a/Lib/test/test_deque.py Tue Jun 11 22:13:17 2013 -0500 +++ b/Lib/test/test_deque.py Fri Jun 14 01:06:33 2013 -0400 @@ -522,7 +522,7 @@ @test_support.cpython_only def test_sizeof(self): - BLOCKLEN = 62 + BLOCKLEN = 64 basesize = test_support.calcobjsize('2P4PlP') blocksize = struct.calcsize('2P%dP' % BLOCKLEN) self.assertEqual(object.__sizeof__(deque()), basesize) diff -r ca8e86711403 -r 5accb0ac8bfb Modules/_collectionsmodule.c --- a/Modules/_collectionsmodule.c Tue Jun 11 22:13:17 2013 -0500 +++ b/Modules/_collectionsmodule.c Fri Jun 14 01:06:33 2013 -0400 @@ -8,12 +8,13 @@ */ /* The block length may be set to any number over 1. Larger numbers - * reduce the number of calls to the memory allocator but take more - * memory. Ideally, BLOCKLEN should be set with an eye to the - * length of a cache line. + * 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. */ -#define BLOCKLEN 62 +#define BLOCKLEN 64 #define CENTER ((BLOCKLEN - 1) / 2) /* A `dequeobject` is composed of a doubly-linked list of `block` nodes. @@ -58,13 +59,8 @@ static block * newblock(block *leftlink, block *rightlink, Py_ssize_t len) { block *b; - /* To prevent len from overflowing PY_SSIZE_T_MAX on 64-bit machines, we - * refuse to allocate new blocks if the current len is dangerously - * close. There is some extra margin to prevent spurious arithmetic - * overflows at various places. The following check ensures that - * the blocks allocated to the deque, in the worst case, can only - * have PY_SSIZE_T_MAX-2 entries in total. - */ + /* To prevent len from overflowing PY_SSIZE_T_MAX on 32-bit machines, we + * refuse to allocate new blocks if the current len is nearing overflow. */ if (len >= PY_SSIZE_T_MAX - 2*BLOCKLEN) { PyErr_SetString(PyExc_OverflowError, "cannot add more blocks to the deque"); /python@rcn.com