On Fri, 31 Dec 2010 14:40:44 -0000, Marcin Babij <marcin.ba...@nasza-klasa.pl> wrote:

Why we do this?
We run profiling on our production servers and found out that zend_hash_*
functions take 10-20% CPU time of request. So there is some room for easy
improvements.

What was done?
- Hash function in zend_hash.h was rebuilt and became much faster, without losing the most important properties.
- Hashtable implementation was changed from Simple chaining to Open
addressing with linear probing, but with linked bucket, not included in
hash array, which causes:
-- Bucket structure to lose 2 pointers.
-- Searching works similar, but don't have to jump with pointers stored in different memory locations, inserting, deleting and rehashing don't need
to update linked list, but must search for first empty bucket, which is
fast, because it scans continuous memory.
-- Load factor decreases from 1.0 to 0.5-0.75 to make less collisions and
faster hashtable, which in turn increases memory footprint a little.
- Open addressing doesn't change significantly performance, but next thing was to create new array (arEmpty), which is of size nTableSize bytes,
which keeps track of used/empty buckets and makes inserting and rehashing
much faster. In future it can be tested as bit-array with size of
nTableSize/8 bytes.

Nice work. Only two comments:

This is much faster than just testing the value of the Bucket pointer for NULL (BTW, NULL pointer != 0 bit pattern, but I guess this is a lost cause in PHP's codebase...)? I'm a bit surprised; though perhaps this could allow more cache hits (and indicates changing it into a bit array could very well be beneficial).

A patch against trunk would be nicer since that's where there's a chance this will be merged to. Also, since you're changing the hash function, html_table_gen.php must changed and run to regenerate html_tables.h. See http://lxr.php.net/xref/PHP_TRUNK/ext/standard/html_tables/html_table_gen.php#722 (ignore the comment; there's obviously nothing unrolled).

--
Gustavo Lopes

--
PHP Internals - PHP Runtime Development Mailing List
To unsubscribe, visit: http://www.php.net/unsub.php

Reply via email to