diff options
author | William Joye <wjoye@cfa.harvard.edu> | 2016-10-19 18:28:08 (GMT) |
---|---|---|
committer | William Joye <wjoye@cfa.harvard.edu> | 2016-10-19 18:28:08 (GMT) |
commit | 7f402e480a04b974617c04142993d3919457d342 (patch) | |
tree | a39cf901d49b9767df3fe076ebf8a06c92277995 /libxml2/optim | |
parent | 818fd731f62993dc8aa5d07b82e1d1b2c04aae7d (diff) | |
parent | 6c75f0dc676d73c4cbcdca5a9cf05c6797a2ac0b (diff) | |
download | blt-7f402e480a04b974617c04142993d3919457d342.zip blt-7f402e480a04b974617c04142993d3919457d342.tar.gz blt-7f402e480a04b974617c04142993d3919457d342.tar.bz2 |
Merge commit '6c75f0dc676d73c4cbcdca5a9cf05c6797a2ac0b' as 'libxml2'
Diffstat (limited to 'libxml2/optim')
-rw-r--r-- | libxml2/optim/TOTRY | 23 | ||||
-rw-r--r-- | libxml2/optim/hash_dict.patch | 257 | ||||
-rw-r--r-- | libxml2/optim/hash_dict.txt | 11 |
3 files changed, 291 insertions, 0 deletions
diff --git a/libxml2/optim/TOTRY b/libxml2/optim/TOTRY new file mode 100644 index 0000000..6e11f7e --- /dev/null +++ b/libxml2/optim/TOTRY @@ -0,0 +1,23 @@ +XML: +==== + - I/O avoid copies when parsing mmap'ed files, need to use + unmutable buffers except for the last 4K to make it 0 terminated + (or get rid of 0 termination check in the whole parser, hard !) + - recheck > 4Gb instances for parsing, and RNG validation. + + +XSLT: +===== + - global variable access + for each expr in stylesheet : allocate index + for each transformation context + create an index table + cache values in the transformation + - context evaluation + - cache + - constants at the XPAth level + - provide more info on compiled expressions + - dependances w.r.t. variables (which ones) + - dependancy on the current node + - dependancy on the current document + - do not use _private but other fields in the node structures. diff --git a/libxml2/optim/hash_dict.patch b/libxml2/optim/hash_dict.patch new file mode 100644 index 0000000..6c50abc --- /dev/null +++ b/libxml2/optim/hash_dict.patch @@ -0,0 +1,257 @@ +Index: hash.c +=================================================================== +RCS file: /cvs/gnome/gnome-xml/hash.c,v +retrieving revision 1.30 +diff -u -r1.30 hash.c +--- hash.c 29 Oct 2003 11:18:37 -0000 1.30 ++++ hash.c 24 Feb 2004 17:18:42 -0000 +@@ -26,6 +26,7 @@ + #include <libxml/xmlmemory.h> + #include <libxml/xmlerror.h> + #include <libxml/globals.h> ++#include <libxml/dict.h> + + #define MAX_HASH_LEN 8 + +@@ -38,9 +39,9 @@ + typedef xmlHashEntry *xmlHashEntryPtr; + struct _xmlHashEntry { + struct _xmlHashEntry *next; +- xmlChar *name; +- xmlChar *name2; +- xmlChar *name3; ++ const xmlChar *name; ++ const xmlChar *name2; ++ const xmlChar *name3; + void *payload; + int valid; + }; +@@ -52,6 +53,7 @@ + struct _xmlHashEntry *table; + int size; + int nbElems; ++ xmlDictPtr dict; + }; + + /* +@@ -143,12 +145,16 @@ + xmlHashTablePtr + xmlHashCreate(int size) { + xmlHashTablePtr table; ++ xmlDictPtr dict; + + if (size <= 0) + size = 256; + ++ dict = xmlDictCreate(); ++ if (dict == NULL) return(NULL); + table = xmlMalloc(sizeof(xmlHashTable)); + if (table) { ++ table->dict = dict; + table->size = size; + table->nbElems = 0; + table->table = xmlMalloc(size * sizeof(xmlHashEntry)); +@@ -158,6 +164,7 @@ + } + xmlFree(table); + } ++ xmlDictFree(dict); + return(NULL); + } + +@@ -282,12 +289,6 @@ + next = iter->next; + if ((f != NULL) && (iter->payload != NULL)) + f(iter->payload, iter->name); +- if (iter->name) +- xmlFree(iter->name); +- if (iter->name2) +- xmlFree(iter->name2); +- if (iter->name3) +- xmlFree(iter->name3); + iter->payload = NULL; + if (!inside_table) + xmlFree(iter); +@@ -299,6 +300,7 @@ + } + xmlFree(table->table); + } ++ xmlDictFree(table->dict); + xmlFree(table); + } + +@@ -465,6 +467,9 @@ + + if ((table == NULL) || name == NULL) + return(-1); ++ if (name) name = xmlDictLookup(table->dict, name, -1); ++ if (name2) name2 = xmlDictLookup(table->dict, name2, -1); ++ if (name3) name3 = xmlDictLookup(table->dict, name3, -1); + + /* + * Check for duplicate and insertion location. +@@ -475,15 +480,15 @@ + } else { + for (insert = &(table->table[key]); insert->next != NULL; + insert = insert->next) { +- if ((xmlStrEqual(insert->name, name)) && +- (xmlStrEqual(insert->name2, name2)) && +- (xmlStrEqual(insert->name3, name3))) ++ if ((insert->name == name) && ++ (insert->name2 == name2) && ++ (insert->name3 == name3)) + return(-1); + len++; + } +- if ((xmlStrEqual(insert->name, name)) && +- (xmlStrEqual(insert->name2, name2)) && +- (xmlStrEqual(insert->name3, name3))) ++ if ((insert->name == name) && ++ (insert->name2 == name2) && ++ (insert->name3 == name3)) + return(-1); + } + +@@ -495,9 +500,9 @@ + return(-1); + } + +- entry->name = xmlStrdup(name); +- entry->name2 = xmlStrdup(name2); +- entry->name3 = xmlStrdup(name3); ++ entry->name = name; ++ entry->name2 = name2; ++ entry->name3 = name3; + entry->payload = userdata; + entry->next = NULL; + entry->valid = 1; +@@ -539,6 +544,9 @@ + + if ((table == NULL) || name == NULL) + return(-1); ++ if (name) name = xmlDictLookup(table->dict, name, -1); ++ if (name2) name2 = xmlDictLookup(table->dict, name2, -1); ++ if (name3) name3 = xmlDictLookup(table->dict, name3, -1); + + /* + * Check for duplicate and insertion location. +@@ -549,18 +557,18 @@ + } else { + for (insert = &(table->table[key]); insert->next != NULL; + insert = insert->next) { +- if ((xmlStrEqual(insert->name, name)) && +- (xmlStrEqual(insert->name2, name2)) && +- (xmlStrEqual(insert->name3, name3))) { ++ if ((insert->name == name) && ++ (insert->name2 == name2) && ++ (insert->name3 == name3)) { + if (f) + f(insert->payload, insert->name); + insert->payload = userdata; + return(0); + } + } +- if ((xmlStrEqual(insert->name, name)) && +- (xmlStrEqual(insert->name2, name2)) && +- (xmlStrEqual(insert->name3, name3))) { ++ if ((insert->name == name) && ++ (insert->name2 == name2) && ++ (insert->name3 == name3)) { + if (f) + f(insert->payload, insert->name); + insert->payload = userdata; +@@ -576,9 +584,9 @@ + return(-1); + } + +- entry->name = xmlStrdup(name); +- entry->name2 = xmlStrdup(name2); +- entry->name3 = xmlStrdup(name3); ++ entry->name = name; ++ entry->name2 = name2; ++ entry->name3 = name3; + entry->payload = userdata; + entry->next = NULL; + entry->valid = 1; +@@ -615,10 +623,13 @@ + key = xmlHashComputeKey(table, name, name2, name3); + if (table->table[key].valid == 0) + return(NULL); ++ if (name) name = xmlDictLookup(table->dict, name, -1); ++ if (name2) name2 = xmlDictLookup(table->dict, name2, -1); ++ if (name3) name3 = xmlDictLookup(table->dict, name3, -1); + for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { +- if ((xmlStrEqual(entry->name, name)) && +- (xmlStrEqual(entry->name2, name2)) && +- (xmlStrEqual(entry->name3, name3))) ++ if ((entry->name == name) && ++ (entry->name2 == name2) && ++ (entry->name3 == name3)) + return(entry->payload); + } + return(NULL); +@@ -774,6 +785,9 @@ + if (f == NULL) + return; + ++ if (name) name = xmlDictLookup(table->dict, name, -1); ++ if (name2) name2 = xmlDictLookup(table->dict, name2, -1); ++ if (name3) name3 = xmlDictLookup(table->dict, name3, -1); + if (table->table) { + for(i = 0; i < table->size; i++) { + if (table->table[i].valid == 0) +@@ -781,9 +795,9 @@ + iter = &(table->table[i]); + while (iter) { + next = iter->next; +- if (((name == NULL) || (xmlStrEqual(name, iter->name))) && +- ((name2 == NULL) || (xmlStrEqual(name2, iter->name2))) && +- ((name3 == NULL) || (xmlStrEqual(name3, iter->name3))) && ++ if (((name == NULL) || (name == iter->name)) && ++ ((name2 == NULL) || (name2 == iter->name2)) && ++ ((name3 == NULL) || (name3 == iter->name3)) && + (iter->payload != NULL)) { + f(iter->payload, data, iter->name, + iter->name2, iter->name3); +@@ -913,19 +927,16 @@ + if (table->table[key].valid == 0) { + return(-1); + } else { ++ if (name) name = xmlDictLookup(table->dict, name, -1); ++ if (name2) name2 = xmlDictLookup(table->dict, name2, -1); ++ if (name3) name3 = xmlDictLookup(table->dict, name3, -1); + for (entry = &(table->table[key]); entry != NULL; entry = entry->next) { +- if (xmlStrEqual(entry->name, name) && +- xmlStrEqual(entry->name2, name2) && +- xmlStrEqual(entry->name3, name3)) { ++ if ((entry->name == name) && ++ (entry->name2 == name2) && ++ (entry->name3 == name3)) { + if ((f != NULL) && (entry->payload != NULL)) + f(entry->payload, entry->name); + entry->payload = NULL; +- if(entry->name) +- xmlFree(entry->name); +- if(entry->name2) +- xmlFree(entry->name2); +- if(entry->name3) +- xmlFree(entry->name3); + if(prev) { + prev->next = entry->next; + xmlFree(entry); +Index: include/libxml/hash.h +=================================================================== +RCS file: /cvs/gnome/gnome-xml/include/libxml/hash.h,v +retrieving revision 1.15 +diff -u -r1.15 hash.h +--- include/libxml/hash.h 20 Nov 2003 11:59:07 -0000 1.15 ++++ include/libxml/hash.h 24 Feb 2004 17:18:42 -0000 +@@ -42,7 +42,7 @@ + * + * Callback to free data from a hash. + */ +-typedef void (*xmlHashDeallocator)(void *payload, xmlChar *name); ++typedef void (*xmlHashDeallocator)(void *payload, const xmlChar *name); + /** + * xmlHashCopier: + * @payload: the data in the hash diff --git a/libxml2/optim/hash_dict.txt b/libxml2/optim/hash_dict.txt new file mode 100644 index 0000000..a447b7e --- /dev/null +++ b/libxml2/optim/hash_dict.txt @@ -0,0 +1,11 @@ +Reuses a dictionary for the hash table to reduce the string compare +costs. Not worth it unless validating big DTDs + + without with +db10000 tree 175/79 179/81 +db100000 stream 1222 1217 +dba100000stream 593 601 +REC validation 1986 2098 +Docbook valid 10808 10649 + +Tue Feb 24 19:09:49 CET 2004 |