summaryrefslogtreecommitdiffstats
path: root/optim
diff options
context:
space:
mode:
authorWilliam Joye <wjoye@cfa.harvard.edu>2016-10-19 18:28:08 (GMT)
committerWilliam Joye <wjoye@cfa.harvard.edu>2016-10-19 18:28:08 (GMT)
commit6c75f0dc676d73c4cbcdca5a9cf05c6797a2ac0b (patch)
tree9d02930f4051f5668db352fee9d06a934ed7fca7 /optim
downloadblt-6c75f0dc676d73c4cbcdca5a9cf05c6797a2ac0b.zip
blt-6c75f0dc676d73c4cbcdca5a9cf05c6797a2ac0b.tar.gz
blt-6c75f0dc676d73c4cbcdca5a9cf05c6797a2ac0b.tar.bz2
Squashed 'libxml2/' content from commit 56a6e1a
git-subtree-dir: libxml2 git-subtree-split: 56a6e1aebed937941d2960cc5012665a5ca0115e
Diffstat (limited to 'optim')
-rw-r--r--optim/TOTRY23
-rw-r--r--optim/hash_dict.patch257
-rw-r--r--optim/hash_dict.txt11
3 files changed, 291 insertions, 0 deletions
diff --git a/optim/TOTRY b/optim/TOTRY
new file mode 100644
index 0000000..6e11f7e
--- /dev/null
+++ b/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/optim/hash_dict.patch b/optim/hash_dict.patch
new file mode 100644
index 0000000..6c50abc
--- /dev/null
+++ b/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/optim/hash_dict.txt b/optim/hash_dict.txt
new file mode 100644
index 0000000..a447b7e
--- /dev/null
+++ b/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