Le jeudi 29 novembre 2012 10:48:45 UTC+1, Sebastian Krebs a écrit : > > > > 2012/11/29 Nicolas <nicolas....@gmail.com <javascript:>> > >> *Hashmap*, finally after a strange wakeup in the middle of the night, i >> researched how the array is implemented in php. I taked my last hour (or >> two) to read wikipedia and the php sources (wikipedia, >> <http://en.wikipedia.org/wiki/Hash_table> >> zend_hash.h<https://github.com/php/php-src/blob/master/Zend/zend_hash.h#L261> >> and >> zend_hash.c<https://github.com/php/php-src/blob/master/Zend/zend_hash.c#L909> >> ). >> >> If i see this >> graph<http://upload.wikimedia.org/wikipedia/commons/7/7d/Hash_table_3_1_1_0_1_0_0_SP.svg>, >> >> from wikipedia, the hash isn't use to find the keys, but to find the value >> (the cost is O(1) at less to find the value *linked *to a key). >> >> If i see the code and particulary the following, i have the impress that >> the hash table is a linked list pointer which iterate on a linked list >> of item (call >> bucket<https://github.com/php/php-src/blob/master/Zend/zend_hash.h#L54>with >> key, value). If the cost was only O(1), the following function >> zend_hash_index_exists should just return value of a structure indicated >> by a pointer, in this case the cost seems to be O(1) to O(n) following the >> place of the key, for me *ulong h* is the hash : >> >> >> ZEND_API int zend_hash_index_exists(const HashTable *ht, ulong h) >> { >> uint nIndex; >> Bucket *p; >> IS_CONSISTENT(ht); >> nIndex = h & ht->nTableMask; >> p = ht->arBuckets[nIndex]; >> while (p != NULL) { >> if ((p->h == h) && (p->nKeyLength == 0)) { >> return 1; >> } >> >> p = p->pNext; >> } >> >> return 0; >> } >> >> Finally i'm not completly sure how php implements each array, but it >> seems to me that O(1) isn't right. And in fact even if a hash simplify the >> search a hash can't return a memory place with a data structure or a >> type by itself. It must be finded in a linked list before. >> > > Why? :confused: A hashmap is a direct-memory structure. It's like "item > you are looking for is at [offset] + [hash]%[maxBuckets]". This can be > itself a pointer and I can directly jump to that address. There is > absolutely no iteration required (and useful). >
After search all power of 2 superior at *32768 *cause many collisions because all hash_key become indenticals, (hack here<http://events.ccc.de/congress/2011/Fahrplan/attachments/2007_28C3_Effective_DoS_on_web_application_platforms.pdf>, the correctif don't change behavior, just protect Globals). If you simplify all, forget the limit cases (hash collision, full hashmap), you find O(1) as complexity, but i cannot prevent me to think that collisions appear and the O(1), transforms itself in O(n*x) (with x as collision rate as average case, and if you considere x as a constant... The hash_code creation is too O(n) regarding n as the key length, it isn't nothing. Consequently to the collision, the first key in the map have a directly access by hash, with more chance than the key at the end of the map. I think always that a big array is a sensible data, which could be design with attention, this was just my term here. Thanks to php to hide that :) But should we forget there pointers, >> structures and others c behaviors? >> > > We should, because we are not developing in C. Don't give them too much > value, they are implementation details of the underlying engine and usually > there a negliable against what your application _really_ does (especially > IO). We could even take registers and such into account, but where should > it end? > I'm not completly agree, you should think about your underlying dependencies, with references and registers as you say, but too with all the libraries directly in your workflow : how curl works, if you make http/ftp request, how database works (even with an orm<http://docs.doctrine-project.org/en/2.1/reference/batch-processing.html> )... And as the C is the php base, with the C too. A little *joke *test, view many times but surelly exact https://gist.github.com/4176171, and showing flagrants differences if you take time to test it (one to 4). And the response is in thinking about pointer and affectation prefer than php variables. I agree that many others thing are importants (efficiency, custumer satisfactions, tests, reusability...), but we cannot trash all optimisation. > > >> However, the autoloading take time and was clearly showed on my profiler >> traces, and even if this seems not that symfony will win many speed, it >> will loose nothing and *gain *in the same time a *little speed* and *clarity >> with hermetic environnements.* >> > > Be careful with such statements: It may loose stability by introducing > complexity. The 1% is it definitely not worth. Be careful with micro > optimizations! > 1. I'm not sure hermetic and definable environnements in composer and consequently in class map could be consider as a complexity (seems easy coding), neither a micro optimization and this was the main code objective. 2. Surelly but no code optimization is a worst case particularly *when the computer speed don't growth and so many posts shoot symfony for its speed. T *oo many in my mind, this is the reason which could me to begin a discussion on speed. On this, good weekend, maybe at the next week. > > >> * >> * >> Le mercredi 28 novembre 2012 17:05:15 UTC+1, Sebastian Krebs a écrit : >> >>> As long as a classmap is a map, it's a hashmap and therefore the access >>> is usually O(1), meaning: Doesn't care, where the corresponding class >>> appears within the list. >>> >>> >>> 2012/11/28 Nicolas <nicolas....@gmail.com> >>> >>>> Tests maded with apc, and even with apc the class isn't load if the >>>> file isn't load, so apc don't avoid the autoload mecanismus. >>>> >>>> For the differences beetween dev and prod environnement, i think the >>>> number of classes isn't the only point, the order is to a problem, as >>>> symfony is at the end of the class map (the order is alphabetical), so >>>> each >>>> symfony class take more than 1500 comparisons strings to just load the >>>> classes at every requests. >>>> >>>> Le mercredi 28 novembre 2012 06:46:55 UTC+1, Cameron Junge a écrit : >>>> >>>>> Were the tests performed with & without APC? APC will load the file >>>>> straight from memory in a compiled form, so should help speed things up >>>>> if >>>>> the original tests were performed without it. Most production >>>>> environments >>>>> use a cache. >>>>> >>>>> Building an optimized classmap for each environment would probably >>>>> only alter a small number of classes, so not sure what benefit there is >>>>> in >>>>> having multiple versions. For example, the difference between dev & >>>>> production on one of my projects would probably be a few 10s or so >>>>> classes... and some of them will be the automatic exchange of a debug >>>>> class >>>>> & the original class. >>>>> >>>>> Cameron >>>>> >>>>> On Saturday, November 24, 2012 5:15:44 PM UTC+13, Nicolas wrote: >>>>>> >>>>>> Hello, >>>>>> >>>>>> As i play all this afternoon with xdebug, i could see that* the >>>>>> class loader* take time and mainly *is called many times (~900 by >>>>>> request)*. >>>>>> >>>>>> As i wanted* to improve the speed of a production environnement,* i >>>>>> made tests and watch in details as the code is called. >>>>>> >>>>>> After take improvement give by the docs and finally by the command >>>>>> >>>>>>> php composer.phar dump-autoload --optimize >>>>>> >>>>>> >>>>>> I* remove *from the file *vendor/composer/autoload_classmap.php* >>>>>> produced *the tests classes* (252 on 2890, less than 1%) and run >>>>>> tests with and without there changes. The result of the tests are in >>>>>> a gist <https://gist.github.com/4137837>. The gain is a little more >>>>>> than one percent on a complex page and less significant on a hello world >>>>>> page. >>>>>> >>>>>> My personnals conclusions are the array class's map should be >>>>>> optimised. Solutions could be than : >>>>>> >>>>>> - A *arbitrary* *environnements *should be defined* in composer*to >>>>>> correspond to applications and produce specific class_loader files >>>>>> purposing *to reduce the array size* >>>>>> >>>>>> >>>>>> - The* order of calling frequencies* should impose* t*he *order >>>>>> in composer requirements* which should save it in *the order of >>>>>> the classes's map *file (vendor/composer/autoload_[**env** >>>>>> ]_classmap.php)*, to reduce the search time* >>>>>> >>>>>> I have begin to post there solutions in a composer issue created by >>>>>> Seldaek few month ago. But as i maded tests on symfony, as i have a >>>>>> little voice in the symfony community, and i think you could think >>>>>> better, >>>>>> and certainly produce smarter code than me about there behaviors with >>>>>> better acuity (mostly as i see the time i spend to make this mail >>>>>> and so... and the hour it is). >>>>>> >>>>>> So good night, or have nice day, >>>>>> >>>>>> Best Regards, >>>>>> >>>>>> Nicola >>>>>> >>>>>> PS: Very thanks for all you works, symfony and composer and all the >>>>>> library become more and more nice to use. >>>>>> >>>>> -- >>>> If you want to report a vulnerability issue on symfony, please send it >>>> to security at symfony-project.com >>>> >>>> You received this message because you are subscribed to the Google >>>> Groups "symfony developers" group. >>>> To post to this group, send email to symfon...@googlegroups.com >>>> >>>> To unsubscribe from this group, send email to >>>> symfony-devs...@**googlegroups.com >>>> >>>> For more options, visit this group at >>>> http://groups.google.com/**group/symfony-devs?hl=en<http://groups.google.com/group/symfony-devs?hl=en> >>>> >>> >>> >>> >>> -- >>> github.com/KingCrunch >>> >>> -- >> If you want to report a vulnerability issue on symfony, please send it to >> security at symfony-project.com >> >> You received this message because you are subscribed to the Google >> Groups "symfony developers" group. >> To post to this group, send email to symfon...@googlegroups.com<javascript:> >> To unsubscribe from this group, send email to >> symfony-devs...@googlegroups.com <javascript:> >> For more options, visit this group at >> http://groups.google.com/group/symfony-devs?hl=en >> > > > > -- > github.com/KingCrunch > > -- If you want to report a vulnerability issue on symfony, please send it to security at symfony-project.com You received this message because you are subscribed to the Google Groups "symfony developers" group. To post to this group, send email to symfony-devs@googlegroups.com To unsubscribe from this group, send email to symfony-devs+unsubscr...@googlegroups.com For more options, visit this group at http://groups.google.com/group/symfony-devs?hl=en