summaryrefslogtreecommitdiff
AgeCommit message (Collapse)Author
2014-10-27Optimize node printing by using raw pointersArseny Kapoulkine
This lets us do fewer null pointer checks (making printing 2% faster with -O3) and removes a lot of function calls (making printing 20% faster with -O0).
2014-10-27XPath: Optimize [position()=expr] and [last()]Arseny Kapoulkine
To get more benefits from constant predicate/filter optimization we rewrite [position()=expr] predicates into [expr] for numeric expressions. Right now the rewrite is only for entire expressions - it may be beneficial to split complex expressions like [position()=constant and expr] into [constant][expr] but that is more complicated. last() does not depend on the node set contents so is "constant" as far as our optimization is concerned so we can evaluate it once.
2014-10-26XPath: Only recognize numeric constant expressionsArseny Kapoulkine
Numeric and boolean constant expressions in filters are different in that to evaluate numeric expressions we need a sorted order, but to evaluate boolean expressions we don't. The previously implemented optimization adds an extra sorting step for constant boolean filters that will be more expensive than redundant computations. Since constant booleans are sort of an edge case, don't do this optimization. This allows us to simplify apply_predicate_const to only handle numbers.
2014-10-26XPath: Unify ast_filter/ast_predicate structureArseny Kapoulkine
Now expression is always _right for filter/predicate nodes to make optimize() simpler. Additionally we now use predicate metadata to make is_posinv_step() faster. This introduces a weak ordering dependency in rewrite rules to optimize() - classification has to be performed before other optimizations.
2014-10-26XPath: Optimize constant filters/predicatesArseny Kapoulkine
If a filter/predicate expression is a constant, we don't need to evaluate it for every nodeset element - we can evaluate it once and pick the right element or keep/discard the entire collection. If the expression is 1, we can early out on first node when evaluating the node set - queries like following::item[1] are now significantly faster. Additionally this change refactors filters/predicates to have additional metadata describing the expression type in _test field that is filled during optimization. Note that predicate_constant selection right now is very simple (but captures most common use cases except for maybe [last()]).
2014-10-26tests: Remove git2svn helper script!Arseny Kapoulkine
2014-10-26Update README.md with new documentation URLs.Arseny Kapoulkine
2014-10-26tests: Add a way for tests to verify allocation failureArseny Kapoulkine
git-svn-id: https://pugixml.googlecode.com/svn/trunk@1081 99668b35-9821-0410-8761-19e4c4f06640
2014-10-25Fix node copying for some out of memory casesArseny Kapoulkine
A page can fail to allocate during attribute creation; this case was not previously handled. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1080 99668b35-9821-0410-8761-19e4c4f06640
2014-10-25Add 'coverage' configuration to Makefile.Arseny Kapoulkine
git-svn-id: https://pugixml.googlecode.com/svn/trunk@1079 99668b35-9821-0410-8761-19e4c4f06640
2014-10-25Remove redundant null pointer checks.Arseny Kapoulkine
When removing a node or attribute, we know that the parent has at least one node/attribute so a null pointer check is redundant. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1078 99668b35-9821-0410-8761-19e4c4f06640
2014-10-24tests: Fix test failure in PUGIXML_WCHAR_MODEArseny Kapoulkine
git-svn-id: https://pugixml.googlecode.com/svn/trunk@1077 99668b35-9821-0410-8761-19e4c4f06640
2014-10-24tests: Add even more coverage testsArseny Kapoulkine
Also fix MSVC6 compilation (make convertions to function pointers explicit). git-svn-id: https://pugixml.googlecode.com/svn/trunk@1076 99668b35-9821-0410-8761-19e4c4f06640
2014-10-23tests: Add more tests for better coverageArseny Kapoulkine
More tests for out-of-memory and other edge conditions git-svn-id: https://pugixml.googlecode.com/svn/trunk@1075 99668b35-9821-0410-8761-19e4c4f06640
2014-10-23tests: Improve test coverageArseny Kapoulkine
git-svn-id: https://pugixml.googlecode.com/svn/trunk@1074 99668b35-9821-0410-8761-19e4c4f06640
2014-10-21Fix compact modeArseny Kapoulkine
2014-10-21Merge branch 'master' into compactArseny Kapoulkine
2014-10-22XPath: Optimize predicate evaluationArseny Kapoulkine
If the requested evaluation mode is not _all, we can use this mode for the last predicate/filter expression and exit early. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1073 99668b35-9821-0410-8761-19e4c4f06640
2014-10-22XPath: Use node pointers in step_push/step_fillArseny Kapoulkine
Using pointers instead of node/attribute objects allows us to use knowledge about the tree to guarantee that pointers are not null. This results in less null checks (10-20% speedup with optimizations enabled) and less function calls (5x speedup with optimizations disabled). git-svn-id: https://pugixml.googlecode.com/svn/trunk@1072 99668b35-9821-0410-8761-19e4c4f06640
2014-10-20Merge branch 'master' into compactArseny Kapoulkine
2014-10-21tests: Fix PUGIXML_WCHAR_MODE compilationArseny Kapoulkine
git-svn-id: https://pugixml.googlecode.com/svn/trunk@1071 99668b35-9821-0410-8761-19e4c4f06640
2014-10-20Merge branch 'master' into compactArseny Kapoulkine
2014-10-21tests: Assert on out-of-memory in testsArseny Kapoulkine
This should never happen but can improve debugging experience for work-in-progress changes since that avoids memcpy() into negative memory space (debugger can't backtrace from failed memcpy since it does not set up the stack frame). git-svn-id: https://pugixml.googlecode.com/svn/trunk@1070 99668b35-9821-0410-8761-19e4c4f06640
2014-10-21XPath: Make sure step_push is called with valid nodesArseny Kapoulkine
Some steps relied on step_push rejecting null inputs; this is no longer the case. Additionally stepping now more rigorously filters null inputs. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1069 99668b35-9821-0410-8761-19e4c4f06640
2014-10-20tests: Add a coverage test for unspecified_boolArseny Kapoulkine
It's unfortunate that we can even do that... git-svn-id: https://pugixml.googlecode.com/svn/trunk@1068 99668b35-9821-0410-8761-19e4c4f06640
2014-10-20XPath: Introduce _first/_any set evaluation modesArseny Kapoulkine
Sometimes when evaluating the node set we don't need the entire set and only need the first element in docorder or any element. In the absence of iterator support we can still use this information to short-circuit traversals. This does not have any effect on straightforward node collection queries, but frequently improves performance of complex queries with predicates etc. XMark benchmark gets 15x faster with some queries enjoying 100x speedup on 10 Mb dataset due to a significant complexity improvement. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1067 99668b35-9821-0410-8761-19e4c4f06640
2014-10-19docs: Update XPath documentationArseny Kapoulkine
Add documentation for xpath_query::evaluate_node and change select_single_node to select_node in documentation and samples. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1066 99668b35-9821-0410-8761-19e4c4f06640
2014-10-19XPath: Rename xml_node::select_single_node to ::select_nodeArseny Kapoulkine
select_node is shorter and mistyping nodes as node or vice versa should not lead to any issues since return types are substantially different. select_single_node method still works and will be deprecated with an attribute and removed at some point. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1065 99668b35-9821-0410-8761-19e4c4f06640
2014-10-19XPath: Introduce xpath_query::evaluate_nodeArseny Kapoulkine
This method is equivalent to xml_node::select_single_node. This makes select_single_node faster in certain cases by avoiding an allocation and - more importantly - paves the way for future step optimizations. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1064 99668b35-9821-0410-8761-19e4c4f06640
2014-10-18XPath: Extend the descendant-or-self optimizationArseny Kapoulkine
Use descendant-or-self::node() transformation for self, descendant and descendant-or-self axis. Self axis should be semi-frequent; descendant axes should not really be used with // but if they ever are the complexity of the step becomes quadratic so it's better to optimize this if possible. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1063 99668b35-9821-0410-8761-19e4c4f06640
2014-10-16tests: Disable tests that rely on ceil() on CLRArseny Kapoulkine
CLR x64 JIT does not implement ceil() properly (ceil(-0.1) returns positive zero instead of negative zero). Disable the relevant portions of tests so that everything else is green... git-svn-id: https://pugixml.googlecode.com/svn/trunk@1062 99668b35-9821-0410-8761-19e4c4f06640
2014-10-16XPath: Optimize attribute axis lookupArseny Kapoulkine
When looking for an attribute by name, finding the first attribute means we can stop looking since attribute names are unique. This makes some queries faster by 40%. Another very common pattern in XPath queries is finding an attribute with a specified value using a predicate (@name = 'value'). While we perform an optimal amount of traversal in that case, there is a substantial overhead with evaluating the nodes, saving and restoring the stack state, pushing the attribute node into a set, etc. Detecting this pattern allows us to use optimized code, resulting in up to 2x speedup for some queries. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1061 99668b35-9821-0410-8761-19e4c4f06640
2014-10-15XPath: Fix optimization bug with //name[last()]Arseny Kapoulkine
The actual condition for the optimization is invariance from context list -- this includes both position() and last(). Instead of splitting the posinv concept just include last() into non-posinv expressions - this requires sorting for boolean predicates that depend on last() and do not depend on position(). These cases should be very rare. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1060 99668b35-9821-0410-8761-19e4c4f06640
2014-10-14tests: Add a test for printing comments that contain --Arseny Kapoulkine
git-svn-id: https://pugixml.googlecode.com/svn/trunk@1059 99668b35-9821-0410-8761-19e4c4f06640
2014-10-14Adjust comment output to avoid malformed documents.Arseny Kapoulkine
Comment value can not contain the string "--" or end with "-". Since comments do not support escaping, we're handling this by adding an extra space after the first "-". A string of "-" thus turns into "- - - ...". git-svn-id: https://pugixml.googlecode.com/svn/trunk@1058 99668b35-9821-0410-8761-19e4c4f06640
2014-10-11Fix compact mode for 64-bit architecturesArseny Kapoulkine
2014-10-11Compact implementation refactoringArseny Kapoulkine
Remove compact stats and tags, replace pointer hash with murmur3 32-bit finalizer.
2014-10-10Merge branch 'master' into compactArseny Kapoulkine
2014-10-11Swap insert_attribute_* implementationsArseny Kapoulkine
Make sure their order is consistent with the order of declaration in header file. git-svn-id: https://pugixml.googlecode.com/svn/trunk@1057 99668b35-9821-0410-8761-19e4c4f06640
2014-10-10tests: Reenable all tests for compact modeArseny Kapoulkine
2014-10-10Split hash table operations into reserve and insertArseny Kapoulkine
Insert is now unsafe - since we don't have a way to handle rehash() failures transparently we need to reserve space beforehand. Reserve is now called before every tree-mutating operations and it guarantees that we can perform 16 arbitrary pointer mutations after that. This fixes all test crashes with compact mode.
2014-10-10Move compact_hash_table before xml_allocator.Arseny Kapoulkine
This helps streamline class dependencies and will make subsequent changes smaller.
2014-10-10Merge branch 'master' into compactArseny Kapoulkine
2014-10-11Refactor node/attribute tree operationsArseny Kapoulkine
All ad-hoc attribute operations are now implemented as explicit low-level functions, and xml_node just uses them. Additionally extract commonly used is_attribute_of and move detaching of node from append_node to remove_node - append_node now only works on detached nodes (small increase in parsing performance). git-svn-id: https://pugixml.googlecode.com/svn/trunk@1056 99668b35-9821-0410-8761-19e4c4f06640
2014-10-10Fix Borland C++ compilation errors/warningsArseny Kapoulkine
git-svn-id: https://pugixml.googlecode.com/svn/trunk@1055 99668b35-9821-0410-8761-19e4c4f06640
2014-10-09Change compact_pointer_parent to use 2 bytesArseny Kapoulkine
Parent pointers need to be able to reach everywhere within a page to minimize shared parent pointer reuse unless it's absolutely necessary. This reduces parent hash utilization on all test cases to <1%. Rename compact_parent to compact_shared_parent.
2014-10-08Optimize compact_pointer_parentArseny Kapoulkine
We now no longer need the compact_alignment type so replace it with a constant.
2014-10-07Rework compact_pointer implementationArseny Kapoulkine
Split the implementation into a generic one with adjustable range and a special implementation for parent (may need to use 2 bytes on that one later). Optimize compact_string and compact_pointer to use minimal amount of math and move slow hash paths into no-inline functions so that compiler can inline the fast-paths. Merge compact_pointer_generic and compact_pointer_forward and optimize.
2014-10-07Remove PUGI__COMPACT helperArseny Kapoulkine
Also remove get() methods on pointer wrappers - this makes the surface area smaller so we can create more of them easier.
2014-10-06Switch to a 3-byte representation for compact stringsArseny Kapoulkine
To make this possible name and value in the node structure had to be merged into one contents field. Not sure what to do with node_pi, since it is the only type that required both.