Hi list,
I inspected the Lua core a little deeper, looking for ways that the
'tru count' could be used to create time savings for ordinary cases.
Rehashes are not that rare and during every rehash the actual true
count of elements in the table is counted, in the core, by traversing
all elements. But on the way, the number of actual integer keys is
also counted - you will remember that some of them also end up stored
in the hash part, instead of in the array.
If I get it right, the algorithm used to allocate space for the array
part, with space to grow, can become quite courageous. A lot of bytes
can get allocated, never to be used, once the table reaches a certain
size. I am not sure Lua can claim to be that focussed on a little foot
print and memory savings there ...
I have inserted a simple printf() to check if the counting that the
rehash does is in fact, as it looks, counting of all present, non-nil
elements. Looks like the answer is, Yes it is. So this means that the
'tru count' counter could make part of that traversal unnecessary and
by that, save some time. Probably not without an additional counter
though, that counts the 'real integer keys' used. And that may not
even be enough, they need to be counted separate as for wether they
are in the right range to fit into the array part or have to reside in
the hash part. So that's two additional counters, with overhead
anytime a key is added (which is different from 'tru count', which has
overhead everytime a value is added, deleted or changed).
Below I am listing an intermediate step on that way, maybe it's of
interest for one of you, to see the re-hash in action. (Just ignore
for now that 'tru count' is always one less than 'totalcount', because
the latter is pro-actively counted up by 1 already at the point when I
print it.)
Note how the hash and array parts grow, respectively. Depending on the
index keys. Also note how the hash part often has only one element ---
that's [0]. A flaw of the test Lua source, if you want, which tests
[0..99999] rather than well behaved [1..100000].
If you run the test yourself, which you could with the sources below,
and the patch, note that the initial lines you will be seeing are Lua
start up activity filling up of the global and other tables. Below, I
[snip]ped it.
Best,
Henning
[snip]
Lua 5.1.4-2 tru count 0.2
-----------------------------------------------------
1000000x t[1] =1
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
1000000x t[1] =1 219ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i] =1 [Below, 'numusehash 1' is due to i=0!]
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 1, numusehash 1, totaluse 3, tru count 2
Rehash: nasize 2, numusehash 1, totaluse 4, tru count 3
Rehash: nasize 4, numusehash 1, totaluse 6, tru count 5
Rehash: nasize 8, numusehash 1, totaluse 10, tru count 9
Rehash: nasize 16, numusehash 1, totaluse 18, tru count 17
Rehash: nasize 32, numusehash 1, totaluse 34, tru count 33
Rehash: nasize 64, numusehash 1, totaluse 66, tru count 65
Rehash: nasize 128, numusehash 1, totaluse 130, tru count 129
Rehash: nasize 256, numusehash 1, totaluse 258, tru count 257
Rehash: nasize 512, numusehash 1, totaluse 514, tru count 513
Rehash: nasize 1024, numusehash 1, totaluse 1026, tru count 1025
Rehash: nasize 2048, numusehash 1, totaluse 2050, tru count 2049
Rehash: nasize 4096, numusehash 1, totaluse 4098, tru count 4097
Rehash: nasize 8192, numusehash 1, totaluse 8194, tru count 8193
Rehash: nasize 16384, numusehash 1, totaluse 16386, tru count 16385
Rehash: nasize 32768, numusehash 1, totaluse 32770, tru count 32769
Rehash: nasize 65536, numusehash 1, totaluse 65538, tru count 65537
Rehash: nasize 131072, numusehash 1, totaluse 131074, tru count 131073
Rehash: nasize 262144, numusehash 1, totaluse 262146, tru count 262145
Rehash: nasize 524288, numusehash 1, totaluse 524290, tru count 524289
1000000x t[i] =1 226ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[-i]=1
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 0, numusehash 2, totaluse 3, tru count 2
Rehash: nasize 0, numusehash 4, totaluse 5, tru count 4
Rehash: nasize 0, numusehash 8, totaluse 9, tru count 8
Rehash: nasize 0, numusehash 16, totaluse 17, tru count 16
Rehash: nasize 0, numusehash 32, totaluse 33, tru count 32
Rehash: nasize 0, numusehash 64, totaluse 65, tru count 64
Rehash: nasize 0, numusehash 128, totaluse 129, tru count 128
Rehash: nasize 0, numusehash 256, totaluse 257, tru count 256
Rehash: nasize 0, numusehash 512, totaluse 513, tru count 512
Rehash: nasize 0, numusehash 1024, totaluse 1025, tru count 1024
Rehash: nasize 0, numusehash 2048, totaluse 2049, tru count 2048
Rehash: nasize 0, numusehash 4096, totaluse 4097, tru count 4096
Rehash: nasize 0, numusehash 8192, totaluse 8193, tru count 8192
Rehash: nasize 0, numusehash 16384, totaluse 16385, tru count 16384
Rehash: nasize 0, numusehash 32768, totaluse 32769, tru count 32768
Rehash: nasize 0, numusehash 65536, totaluse 65537, tru count 65536
Rehash: nasize 0, numusehash 131072, totaluse 131073, tru count 131072
Rehash: nasize 0, numusehash 262144, totaluse 262145, tru count 262144
Rehash: nasize 0, numusehash 524288, totaluse 524289, tru count 524288
1000000x t[-i]=1 541ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i] =i
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 1, numusehash 1, totaluse 3, tru count 2
Rehash: nasize 2, numusehash 1, totaluse 4, tru count 3
Rehash: nasize 4, numusehash 1, totaluse 6, tru count 5
Rehash: nasize 8, numusehash 1, totaluse 10, tru count 9
Rehash: nasize 16, numusehash 1, totaluse 18, tru count 17
Rehash: nasize 32, numusehash 1, totaluse 34, tru count 33
Rehash: nasize 64, numusehash 1, totaluse 66, tru count 65
Rehash: nasize 128, numusehash 1, totaluse 130, tru count 129
Rehash: nasize 256, numusehash 1, totaluse 258, tru count 257
Rehash: nasize 512, numusehash 1, totaluse 514, tru count 513
Rehash: nasize 1024, numusehash 1, totaluse 1026, tru count 1025
Rehash: nasize 2048, numusehash 1, totaluse 2050, tru count 2049
Rehash: nasize 4096, numusehash 1, totaluse 4098, tru count 4097
Rehash: nasize 8192, numusehash 1, totaluse 8194, tru count 8193
Rehash: nasize 16384, numusehash 1, totaluse 16386, tru count 16385
Rehash: nasize 32768, numusehash 1, totaluse 32770, tru count 32769
Rehash: nasize 65536, numusehash 1, totaluse 65538, tru count 65537
Rehash: nasize 131072, numusehash 1, totaluse 131074, tru count 131073
Rehash: nasize 262144, numusehash 1, totaluse 262146, tru count 262145
Rehash: nasize 524288, numusehash 1, totaluse 524290, tru count 524289
1000000x t[i] =i 228ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i] =-i
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 1, numusehash 1, totaluse 3, tru count 2
Rehash: nasize 2, numusehash 1, totaluse 4, tru count 3
Rehash: nasize 4, numusehash 1, totaluse 6, tru count 5
Rehash: nasize 8, numusehash 1, totaluse 10, tru count 9
Rehash: nasize 16, numusehash 1, totaluse 18, tru count 17
Rehash: nasize 32, numusehash 1, totaluse 34, tru count 33
Rehash: nasize 64, numusehash 1, totaluse 66, tru count 65
Rehash: nasize 128, numusehash 1, totaluse 130, tru count 129
Rehash: nasize 256, numusehash 1, totaluse 258, tru count 257
Rehash: nasize 512, numusehash 1, totaluse 514, tru count 513
Rehash: nasize 1024, numusehash 1, totaluse 1026, tru count 1025
Rehash: nasize 2048, numusehash 1, totaluse 2050, tru count 2049
Rehash: nasize 4096, numusehash 1, totaluse 4098, tru count 4097
Rehash: nasize 8192, numusehash 1, totaluse 8194, tru count 8193
Rehash: nasize 16384, numusehash 1, totaluse 16386, tru count 16385
Rehash: nasize 32768, numusehash 1, totaluse 32770, tru count 32769
Rehash: nasize 65536, numusehash 1, totaluse 65538, tru count 65537
Rehash: nasize 131072, numusehash 1, totaluse 131074, tru count 131073
Rehash: nasize 262144, numusehash 1, totaluse 262146, tru count 262145
Rehash: nasize 524288, numusehash 1, totaluse 524290, tru count 524289
1000000x t[i] =-i 231ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[1]='a'
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
1000000x t[1]='a' 221ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i]='a'
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 1, numusehash 1, totaluse 3, tru count 2
Rehash: nasize 2, numusehash 1, totaluse 4, tru count 3
Rehash: nasize 4, numusehash 1, totaluse 6, tru count 5
Rehash: nasize 8, numusehash 1, totaluse 10, tru count 9
Rehash: nasize 16, numusehash 1, totaluse 18, tru count 17
Rehash: nasize 32, numusehash 1, totaluse 34, tru count 33
Rehash: nasize 64, numusehash 1, totaluse 66, tru count 65
Rehash: nasize 128, numusehash 1, totaluse 130, tru count 129
Rehash: nasize 256, numusehash 1, totaluse 258, tru count 257
Rehash: nasize 512, numusehash 1, totaluse 514, tru count 513
Rehash: nasize 1024, numusehash 1, totaluse 1026, tru count 1025
Rehash: nasize 2048, numusehash 1, totaluse 2050, tru count 2049
Rehash: nasize 4096, numusehash 1, totaluse 4098, tru count 4097
Rehash: nasize 8192, numusehash 1, totaluse 8194, tru count 8193
Rehash: nasize 16384, numusehash 1, totaluse 16386, tru count 16385
Rehash: nasize 32768, numusehash 1, totaluse 32770, tru count 32769
Rehash: nasize 65536, numusehash 1, totaluse 65538, tru count 65537
Rehash: nasize 131072, numusehash 1, totaluse 131074, tru count 131073
Rehash: nasize 262144, numusehash 1, totaluse 262146, tru count 262145
Rehash: nasize 524288, numusehash 1, totaluse 524290, tru count 524289
1000000x t[i]='a' 230ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[-i]='a'
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 0, numusehash 2, totaluse 3, tru count 2
Rehash: nasize 0, numusehash 4, totaluse 5, tru count 4
Rehash: nasize 0, numusehash 8, totaluse 9, tru count 8
Rehash: nasize 0, numusehash 16, totaluse 17, tru count 16
Rehash: nasize 0, numusehash 32, totaluse 33, tru count 32
Rehash: nasize 0, numusehash 64, totaluse 65, tru count 64
Rehash: nasize 0, numusehash 128, totaluse 129, tru count 128
Rehash: nasize 0, numusehash 256, totaluse 257, tru count 256
Rehash: nasize 0, numusehash 512, totaluse 513, tru count 512
Rehash: nasize 0, numusehash 1024, totaluse 1025, tru count 1024
Rehash: nasize 0, numusehash 2048, totaluse 2049, tru count 2048
Rehash: nasize 0, numusehash 4096, totaluse 4097, tru count 4096
Rehash: nasize 0, numusehash 8192, totaluse 8193, tru count 8192
Rehash: nasize 0, numusehash 16384, totaluse 16385, tru count 16384
Rehash: nasize 0, numusehash 32768, totaluse 32769, tru count 32768
Rehash: nasize 0, numusehash 65536, totaluse 65537, tru count 65536
Rehash: nasize 0, numusehash 131072, totaluse 131073, tru count 131072
Rehash: nasize 0, numusehash 262144, totaluse 262145, tru count 262144
Rehash: nasize 0, numusehash 524288, totaluse 524289, tru count 524288
1000000x t[-i]='a' 546ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[1]={}
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
1000000x t[1]={} 632ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i]={}
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 1, numusehash 1, totaluse 3, tru count 2
Rehash: nasize 2, numusehash 1, totaluse 4, tru count 3
Rehash: nasize 4, numusehash 1, totaluse 6, tru count 5
Rehash: nasize 8, numusehash 1, totaluse 10, tru count 9
Rehash: nasize 16, numusehash 1, totaluse 18, tru count 17
Rehash: nasize 32, numusehash 1, totaluse 34, tru count 33
Rehash: nasize 64, numusehash 1, totaluse 66, tru count 65
Rehash: nasize 128, numusehash 1, totaluse 130, tru count 129
Rehash: nasize 256, numusehash 1, totaluse 258, tru count 257
Rehash: nasize 512, numusehash 1, totaluse 514, tru count 513
Rehash: nasize 1024, numusehash 1, totaluse 1026, tru count 1025
Rehash: nasize 2048, numusehash 1, totaluse 2050, tru count 2049
Rehash: nasize 4096, numusehash 1, totaluse 4098, tru count 4097
Rehash: nasize 8192, numusehash 1, totaluse 8194, tru count 8193
Rehash: nasize 16384, numusehash 1, totaluse 16386, tru count 16385
Rehash: nasize 32768, numusehash 1, totaluse 32770, tru count 32769
Rehash: nasize 65536, numusehash 1, totaluse 65538, tru count 65537
Rehash: nasize 131072, numusehash 1, totaluse 131074, tru count 131073
Rehash: nasize 262144, numusehash 1, totaluse 262146, tru count 262145
Rehash: nasize 524288, numusehash 1, totaluse 524290, tru count 524289
1000000x t[i]={} 529ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[-i]={}
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 0, numusehash 2, totaluse 3, tru count 2
Rehash: nasize 0, numusehash 4, totaluse 5, tru count 4
Rehash: nasize 0, numusehash 8, totaluse 9, tru count 8
Rehash: nasize 0, numusehash 16, totaluse 17, tru count 16
Rehash: nasize 0, numusehash 32, totaluse 33, tru count 32
Rehash: nasize 0, numusehash 64, totaluse 65, tru count 64
Rehash: nasize 0, numusehash 128, totaluse 129, tru count 128
Rehash: nasize 0, numusehash 256, totaluse 257, tru count 256
Rehash: nasize 0, numusehash 512, totaluse 513, tru count 512
Rehash: nasize 0, numusehash 1024, totaluse 1025, tru count 1024
Rehash: nasize 0, numusehash 2048, totaluse 2049, tru count 2048
Rehash: nasize 0, numusehash 4096, totaluse 4097, tru count 4096
Rehash: nasize 0, numusehash 8192, totaluse 8193, tru count 8192
Rehash: nasize 0, numusehash 16384, totaluse 16385, tru count 16384
Rehash: nasize 0, numusehash 32768, totaluse 32769, tru count 32768
Rehash: nasize 0, numusehash 65536, totaluse 65537, tru count 65536
Rehash: nasize 0, numusehash 131072, totaluse 131073, tru count 131072
Rehash: nasize 0, numusehash 262144, totaluse 262145, tru count 262144
Rehash: nasize 0, numusehash 524288, totaluse 524289, tru count 524288
1000000x t[-i]={} 891ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[1M-i]=1
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 0, totaluse 2, tru count 1
Rehash: nasize 0, numusehash 0, totaluse 3, tru count 2
Rehash: nasize 0, numusehash 0, totaluse 5, tru count 4
Rehash: nasize 0, numusehash 0, totaluse 9, tru count 8
Rehash: nasize 0, numusehash 0, totaluse 17, tru count 16
Rehash: nasize 0, numusehash 0, totaluse 33, tru count 32
Rehash: nasize 0, numusehash 0, totaluse 65, tru count 64
Rehash: nasize 0, numusehash 0, totaluse 129, tru count 128
Rehash: nasize 0, numusehash 0, totaluse 257, tru count 256
Rehash: nasize 0, numusehash 0, totaluse 513, tru count 512
Rehash: nasize 0, numusehash 0, totaluse 1025, tru count 1024
Rehash: nasize 0, numusehash 0, totaluse 2049, tru count 2048
Rehash: nasize 0, numusehash 0, totaluse 4097, tru count 4096
Rehash: nasize 0, numusehash 0, totaluse 8193, tru count 8192
Rehash: nasize 0, numusehash 0, totaluse 16385, tru count 16384
Rehash: nasize 0, numusehash 0, totaluse 32769, tru count 32768
Rehash: nasize 0, numusehash 0, totaluse 65537, tru count 65536
Rehash: nasize 0, numusehash 0, totaluse 131073, tru count 131072
Rehash: nasize 0, numusehash 0, totaluse 262145, tru count 262144
Rehash: nasize 0, numusehash 0, totaluse 524289, tru count 524288
1000000x t[1M-i]=1 399ns per operation
-----------------------------------------------------
Here is the source of the benchmark:
function printf(...)
io.write(string.format(...))
end
function nanosecs_per_cycle(time, cycles)
return time * 1000000000 / cycles
end
local t = {}
local function measure(prompt, run)
t = {}
local clock = os.clock
local cycles = 1000000
print("-----------------------------------------------------")
printf("%dx %-12s\n", cycles, prompt)
print("-----------------------------------------------------")
local i = 0
local tm = clock()
while(i < cycles) do run(i); i = i + 1 end
tm = clock() - tm
printf("%dx %-12s %10.0fns per operation\n", cycles, prompt,
nanosecs_per_cycle(tm, cycles))
print("-----------------------------------------------------")
end
if(_PATCH) then print(_PATCH) else print(_VERSION .. ' official') end
measure("t[1] =1", function(x) t[1] = 1 end)
measure("t[i] =1", function(i) t[i] = 1 end)
measure("t[-i]=1", function(i) t[-i] = 1 end)
measure("t[i] =i", function(i) t[i] = i end)
measure("t[i] =-i", function(i) t[i] = -i end)
measure("t[1]='a'", function(i) t[1] = 'a' end)
measure("t[i]='a'", function(i) t[i] = 'a' end)
measure("t[-i]='a'", function(i) t[-i] = 'a' end)
measure("t[1]={}", function(i) t[1] = {} end)
measure("t[i]={}", function(i) t[i] = {} end)
measure("t[-i]={}", function(i) t[-i] = {} end)
measure("t[1M-i]=1", function(i) t[1000000-i] = 1 end)
And this is the rehash function that the printf() where inserted into,
which of course slows things down:
ltable.c:334 (Lua 5.1.4-2, tru count patched)
static void rehash (lua_State *L, Table *t, const TValue *ek) {
int nasize, na;
int nums[MAXBITS+1]; /* nums[i] = number of keys between 2^(i-1)
and 2^i */
int i;
int totaluse;
for (i=0; i<=MAXBITS; i++) nums[i] = 0; /* reset counts */
nasize = numusearray(t, nums); /* count keys in array part */
printf("Rehash: nasize %d, ", nasize);
totaluse = na /* !!! */ = nasize; /* all those keys are integer
keys */
totaluse += numusehash(t, nums, &nasize); /* count keys in hash
part */
printf("numusehash %d, ", totaluse - na); /* nasize changed by
numusehash sometimes */
/* count extra key */
nasize += countint(ek, nums);
totaluse++;
printf("totaluse %d, ", totaluse);
printf("tru count %ld\n", t->count);
/* compute new size for array part */
na = computesizes(nums, &nasize);
/* resize the table to new computed sizes */
resize(L, t, nasize, totaluse - na);
}
************************************************************************
************************************************************************
It's also interesting to see how things change when I behave better
and start counting the i in [i] at 1, not 0 as above:
Basically 'the hash stays clean':
Lua 5.1.4-2 tru count 0.2
-----------------------------------------------------
1000000x t[1] =1
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
1000000x t[1] =1 213ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i] =1
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 1, numusehash 0, totaluse 2, tru count 1
Rehash: nasize 2, numusehash 0, totaluse 3, tru count 2
Rehash: nasize 4, numusehash 0, totaluse 5, tru count 4
Rehash: nasize 8, numusehash 0, totaluse 9, tru count 8
Rehash: nasize 16, numusehash 0, totaluse 17, tru count 16
Rehash: nasize 32, numusehash 0, totaluse 33, tru count 32
Rehash: nasize 64, numusehash 0, totaluse 65, tru count 64
Rehash: nasize 128, numusehash 0, totaluse 129, tru count 128
Rehash: nasize 256, numusehash 0, totaluse 257, tru count 256
Rehash: nasize 512, numusehash 0, totaluse 513, tru count 512
Rehash: nasize 1024, numusehash 0, totaluse 1025, tru count 1024
Rehash: nasize 2048, numusehash 0, totaluse 2049, tru count 2048
Rehash: nasize 4096, numusehash 0, totaluse 4097, tru count 4096
Rehash: nasize 8192, numusehash 0, totaluse 8193, tru count 8192
Rehash: nasize 16384, numusehash 0, totaluse 16385, tru count 16384
Rehash: nasize 32768, numusehash 0, totaluse 32769, tru count 32768
Rehash: nasize 65536, numusehash 0, totaluse 65537, tru count 65536
Rehash: nasize 131072, numusehash 0, totaluse 131073, tru count 131072
Rehash: nasize 262144, numusehash 0, totaluse 262145, tru count 262144
Rehash: nasize 524288, numusehash 0, totaluse 524289, tru count 524288
1000000x t[i] =1 217ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[-i]=1
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 0, numusehash 2, totaluse 3, tru count 2
Rehash: nasize 0, numusehash 4, totaluse 5, tru count 4
Rehash: nasize 0, numusehash 8, totaluse 9, tru count 8
Rehash: nasize 0, numusehash 16, totaluse 17, tru count 16
Rehash: nasize 0, numusehash 32, totaluse 33, tru count 32
Rehash: nasize 0, numusehash 64, totaluse 65, tru count 64
Rehash: nasize 0, numusehash 128, totaluse 129, tru count 128
Rehash: nasize 0, numusehash 256, totaluse 257, tru count 256
Rehash: nasize 0, numusehash 512, totaluse 513, tru count 512
Rehash: nasize 0, numusehash 1024, totaluse 1025, tru count 1024
Rehash: nasize 0, numusehash 2048, totaluse 2049, tru count 2048
Rehash: nasize 0, numusehash 4096, totaluse 4097, tru count 4096
Rehash: nasize 0, numusehash 8192, totaluse 8193, tru count 8192
Rehash: nasize 0, numusehash 16384, totaluse 16385, tru count 16384
Rehash: nasize 0, numusehash 32768, totaluse 32769, tru count 32768
Rehash: nasize 0, numusehash 65536, totaluse 65537, tru count 65536
Rehash: nasize 0, numusehash 131072, totaluse 131073, tru count 131072
Rehash: nasize 0, numusehash 262144, totaluse 262145, tru count 262144
Rehash: nasize 0, numusehash 524288, totaluse 524289, tru count 524288
1000000x t[-i]=1 528ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i] =i
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 1, numusehash 0, totaluse 2, tru count 1
Rehash: nasize 2, numusehash 0, totaluse 3, tru count 2
Rehash: nasize 4, numusehash 0, totaluse 5, tru count 4
Rehash: nasize 8, numusehash 0, totaluse 9, tru count 8
Rehash: nasize 16, numusehash 0, totaluse 17, tru count 16
Rehash: nasize 32, numusehash 0, totaluse 33, tru count 32
Rehash: nasize 64, numusehash 0, totaluse 65, tru count 64
Rehash: nasize 128, numusehash 0, totaluse 129, tru count 128
Rehash: nasize 256, numusehash 0, totaluse 257, tru count 256
Rehash: nasize 512, numusehash 0, totaluse 513, tru count 512
Rehash: nasize 1024, numusehash 0, totaluse 1025, tru count 1024
Rehash: nasize 2048, numusehash 0, totaluse 2049, tru count 2048
Rehash: nasize 4096, numusehash 0, totaluse 4097, tru count 4096
Rehash: nasize 8192, numusehash 0, totaluse 8193, tru count 8192
Rehash: nasize 16384, numusehash 0, totaluse 16385, tru count 16384
Rehash: nasize 32768, numusehash 0, totaluse 32769, tru count 32768
Rehash: nasize 65536, numusehash 0, totaluse 65537, tru count 65536
Rehash: nasize 131072, numusehash 0, totaluse 131073, tru count 131072
Rehash: nasize 262144, numusehash 0, totaluse 262145, tru count 262144
Rehash: nasize 524288, numusehash 0, totaluse 524289, tru count 524288
1000000x t[i] =i 218ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i] =-i
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 1, numusehash 0, totaluse 2, tru count 1
Rehash: nasize 2, numusehash 0, totaluse 3, tru count 2
Rehash: nasize 4, numusehash 0, totaluse 5, tru count 4
Rehash: nasize 8, numusehash 0, totaluse 9, tru count 8
Rehash: nasize 16, numusehash 0, totaluse 17, tru count 16
Rehash: nasize 32, numusehash 0, totaluse 33, tru count 32
Rehash: nasize 64, numusehash 0, totaluse 65, tru count 64
Rehash: nasize 128, numusehash 0, totaluse 129, tru count 128
Rehash: nasize 256, numusehash 0, totaluse 257, tru count 256
Rehash: nasize 512, numusehash 0, totaluse 513, tru count 512
Rehash: nasize 1024, numusehash 0, totaluse 1025, tru count 1024
Rehash: nasize 2048, numusehash 0, totaluse 2049, tru count 2048
Rehash: nasize 4096, numusehash 0, totaluse 4097, tru count 4096
Rehash: nasize 8192, numusehash 0, totaluse 8193, tru count 8192
Rehash: nasize 16384, numusehash 0, totaluse 16385, tru count 16384
Rehash: nasize 32768, numusehash 0, totaluse 32769, tru count 32768
Rehash: nasize 65536, numusehash 0, totaluse 65537, tru count 65536
Rehash: nasize 131072, numusehash 0, totaluse 131073, tru count 131072
Rehash: nasize 262144, numusehash 0, totaluse 262145, tru count 262144
Rehash: nasize 524288, numusehash 0, totaluse 524289, tru count 524288
1000000x t[i] =-i 229ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[1]='a'
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
1000000x t[1]='a' 215ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i]='a'
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 1, numusehash 0, totaluse 2, tru count 1
Rehash: nasize 2, numusehash 0, totaluse 3, tru count 2
Rehash: nasize 4, numusehash 0, totaluse 5, tru count 4
Rehash: nasize 8, numusehash 0, totaluse 9, tru count 8
Rehash: nasize 16, numusehash 0, totaluse 17, tru count 16
Rehash: nasize 32, numusehash 0, totaluse 33, tru count 32
Rehash: nasize 64, numusehash 0, totaluse 65, tru count 64
Rehash: nasize 128, numusehash 0, totaluse 129, tru count 128
Rehash: nasize 256, numusehash 0, totaluse 257, tru count 256
Rehash: nasize 512, numusehash 0, totaluse 513, tru count 512
Rehash: nasize 1024, numusehash 0, totaluse 1025, tru count 1024
Rehash: nasize 2048, numusehash 0, totaluse 2049, tru count 2048
Rehash: nasize 4096, numusehash 0, totaluse 4097, tru count 4096
Rehash: nasize 8192, numusehash 0, totaluse 8193, tru count 8192
Rehash: nasize 16384, numusehash 0, totaluse 16385, tru count 16384
Rehash: nasize 32768, numusehash 0, totaluse 32769, tru count 32768
Rehash: nasize 65536, numusehash 0, totaluse 65537, tru count 65536
Rehash: nasize 131072, numusehash 0, totaluse 131073, tru count 131072
Rehash: nasize 262144, numusehash 0, totaluse 262145, tru count 262144
Rehash: nasize 524288, numusehash 0, totaluse 524289, tru count 524288
1000000x t[i]='a' 223ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[-i]='a'
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 0, numusehash 2, totaluse 3, tru count 2
Rehash: nasize 0, numusehash 4, totaluse 5, tru count 4
Rehash: nasize 0, numusehash 8, totaluse 9, tru count 8
Rehash: nasize 0, numusehash 16, totaluse 17, tru count 16
Rehash: nasize 0, numusehash 32, totaluse 33, tru count 32
Rehash: nasize 0, numusehash 64, totaluse 65, tru count 64
Rehash: nasize 0, numusehash 128, totaluse 129, tru count 128
Rehash: nasize 0, numusehash 256, totaluse 257, tru count 256
Rehash: nasize 0, numusehash 512, totaluse 513, tru count 512
Rehash: nasize 0, numusehash 1024, totaluse 1025, tru count 1024
Rehash: nasize 0, numusehash 2048, totaluse 2049, tru count 2048
Rehash: nasize 0, numusehash 4096, totaluse 4097, tru count 4096
Rehash: nasize 0, numusehash 8192, totaluse 8193, tru count 8192
Rehash: nasize 0, numusehash 16384, totaluse 16385, tru count 16384
Rehash: nasize 0, numusehash 32768, totaluse 32769, tru count 32768
Rehash: nasize 0, numusehash 65536, totaluse 65537, tru count 65536
Rehash: nasize 0, numusehash 131072, totaluse 131073, tru count 131072
Rehash: nasize 0, numusehash 262144, totaluse 262145, tru count 262144
Rehash: nasize 0, numusehash 524288, totaluse 524289, tru count 524288
1000000x t[-i]='a' 528ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[1]={}
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
1000000x t[1]={} 635ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[i]={}
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 1, numusehash 0, totaluse 2, tru count 1
Rehash: nasize 2, numusehash 0, totaluse 3, tru count 2
Rehash: nasize 4, numusehash 0, totaluse 5, tru count 4
Rehash: nasize 8, numusehash 0, totaluse 9, tru count 8
Rehash: nasize 16, numusehash 0, totaluse 17, tru count 16
Rehash: nasize 32, numusehash 0, totaluse 33, tru count 32
Rehash: nasize 64, numusehash 0, totaluse 65, tru count 64
Rehash: nasize 128, numusehash 0, totaluse 129, tru count 128
Rehash: nasize 256, numusehash 0, totaluse 257, tru count 256
Rehash: nasize 512, numusehash 0, totaluse 513, tru count 512
Rehash: nasize 1024, numusehash 0, totaluse 1025, tru count 1024
Rehash: nasize 2048, numusehash 0, totaluse 2049, tru count 2048
Rehash: nasize 4096, numusehash 0, totaluse 4097, tru count 4096
Rehash: nasize 8192, numusehash 0, totaluse 8193, tru count 8192
Rehash: nasize 16384, numusehash 0, totaluse 16385, tru count 16384
Rehash: nasize 32768, numusehash 0, totaluse 32769, tru count 32768
Rehash: nasize 65536, numusehash 0, totaluse 65537, tru count 65536
Rehash: nasize 131072, numusehash 0, totaluse 131073, tru count 131072
Rehash: nasize 262144, numusehash 0, totaluse 262145, tru count 262144
Rehash: nasize 524288, numusehash 0, totaluse 524289, tru count 524288
1000000x t[i]={} 521ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[-i]={}
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 1, totaluse 2, tru count 1
Rehash: nasize 0, numusehash 2, totaluse 3, tru count 2
Rehash: nasize 0, numusehash 4, totaluse 5, tru count 4
Rehash: nasize 0, numusehash 8, totaluse 9, tru count 8
Rehash: nasize 0, numusehash 16, totaluse 17, tru count 16
Rehash: nasize 0, numusehash 32, totaluse 33, tru count 32
Rehash: nasize 0, numusehash 64, totaluse 65, tru count 64
Rehash: nasize 0, numusehash 128, totaluse 129, tru count 128
Rehash: nasize 0, numusehash 256, totaluse 257, tru count 256
Rehash: nasize 0, numusehash 512, totaluse 513, tru count 512
Rehash: nasize 0, numusehash 1024, totaluse 1025, tru count 1024
Rehash: nasize 0, numusehash 2048, totaluse 2049, tru count 2048
Rehash: nasize 0, numusehash 4096, totaluse 4097, tru count 4096
Rehash: nasize 0, numusehash 8192, totaluse 8193, tru count 8192
Rehash: nasize 0, numusehash 16384, totaluse 16385, tru count 16384
Rehash: nasize 0, numusehash 32768, totaluse 32769, tru count 32768
Rehash: nasize 0, numusehash 65536, totaluse 65537, tru count 65536
Rehash: nasize 0, numusehash 131072, totaluse 131073, tru count 131072
Rehash: nasize 0, numusehash 262144, totaluse 262145, tru count 262144
Rehash: nasize 0, numusehash 524288, totaluse 524289, tru count 524288
1000000x t[-i]={} 881ns per operation
-----------------------------------------------------
-----------------------------------------------------
1000000x t[1M-i]=1
-----------------------------------------------------
Rehash: nasize 0, numusehash 0, totaluse 1, tru count 0
Rehash: nasize 0, numusehash 0, totaluse 2, tru count 1
Rehash: nasize 0, numusehash 0, totaluse 3, tru count 2
Rehash: nasize 0, numusehash 0, totaluse 5, tru count 4
Rehash: nasize 0, numusehash 0, totaluse 9, tru count 8
Rehash: nasize 0, numusehash 0, totaluse 17, tru count 16
Rehash: nasize 0, numusehash 0, totaluse 33, tru count 32
Rehash: nasize 0, numusehash 0, totaluse 65, tru count 64
Rehash: nasize 0, numusehash 0, totaluse 129, tru count 128
Rehash: nasize 0, numusehash 0, totaluse 257, tru count 256
Rehash: nasize 0, numusehash 0, totaluse 513, tru count 512
Rehash: nasize 0, numusehash 0, totaluse 1025, tru count 1024
Rehash: nasize 0, numusehash 0, totaluse 2049, tru count 2048
Rehash: nasize 0, numusehash 0, totaluse 4097, tru count 4096
Rehash: nasize 0, numusehash 0, totaluse 8193, tru count 8192
Rehash: nasize 0, numusehash 0, totaluse 16385, tru count 16384
Rehash: nasize 0, numusehash 0, totaluse 32769, tru count 32768
Rehash: nasize 0, numusehash 0, totaluse 65537, tru count 65536
Rehash: nasize 0, numusehash 0, totaluse 131073, tru count 131072
Rehash: nasize 0, numusehash 0, totaluse 262145, tru count 262144
Rehash: nasize 0, numusehash 0, totaluse 524289, tru count 524288
Rehash: nasize 999999, numusehash 0, totaluse 1000000, tru count
999999
1000000x t[1M-i]=1 389ns per operation
-----------------------------------------------------