1
0
mirror of https://gitlab.gnome.org/GNOME/libxml2.git synced 2025-03-28 22:50:07 +03:00
Michael Matz faea2fa9b8 Avoid quadratic checking of identity-constraints
key/unique/keyref schema attributes currently use qudratic loops
to check their various constraints (that keys are unique and that
keyrefs refer to existing keys).  That becomes extremely slow if
there are many elements with keys.  This happens in the wild with
e.g. the OVAL XML descriptions of security patches.  You need the
openscap schemata, and then an example xml file:

% zypper in openscap-utils
% wget ftp://ftp.suse.com/pub/projects/security/oval/opensuse.leap.15.1.xml
% time xmllint --schema /usr/share/openscap/schemas/oval/5.5/oval-definitions-schema.xsd opensuse.leap.15.1.xml > /dev/null
opensuse.leap.15.1.xml validates

real    16m59,857s
user    16m55,787s
sys     0m1,060s

This patch makes libxml use a hash table to avoid the quadratic
behaviour.  The existing hash table only accepts strings as keys, so
we're mostly reusing the canonical representation of key values to derive
such strings (with the caveat given in a comment).  The alternative
would be to rework the hash table code to accept either numbers or free
functions as hash workers, but the code is fast enough as is.

With the patch we have this then:

% time LD_LIBRARY_PATH=./libxml2/.libs/ ./libxml2/.libs/xmllint --schema /usr/share/openscap/schemas/oval/5.5/oval-definitions-schema.xsd opensuse.leap.15.1.xml > /dev/null
opensuse.leap.15.1.xml validates

real    0m3,531s
user    0m3,427s
sys     0m0,103s

So, a ~300x speedup.  This patch survives 'make check' and 'make tests'.
2020-11-30 11:22:54 +01:00
2020-03-08 17:41:53 +01:00
2019-09-30 18:04:38 +02:00
2017-11-27 14:35:29 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2017-11-27 14:35:29 +01:00
2020-03-08 17:41:53 +01:00
2020-07-23 20:46:42 +02:00
2014-10-13 16:06:21 +08:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2012-09-11 13:26:36 +08:00
2020-07-12 18:42:18 +02:00
2020-08-17 02:54:28 +02:00
2019-10-20 18:15:34 +02:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2012-09-11 13:26:36 +08:00
2019-09-30 18:05:45 +02:00
2019-09-30 18:04:38 +02:00
2020-11-19 18:10:32 +01:00
2020-03-08 17:41:53 +01:00
2020-08-17 01:17:39 +02:00
2019-09-30 18:04:38 +02:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-02-11 11:32:23 +01:00
2012-08-17 11:59:01 +08:00
2019-09-30 18:04:38 +02:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-11-30 11:22:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2019-09-30 18:04:38 +02:00
2019-09-30 18:04:38 +02:00
2020-03-08 17:41:53 +01:00
2012-05-07 15:23:25 +08:00
2019-09-30 18:04:38 +02:00
2020-03-08 17:41:53 +01:00
2019-09-30 18:04:38 +02:00
2020-08-17 01:17:39 +02:00
2020-03-08 17:41:53 +01:00
2019-09-30 18:04:38 +02:00
2012-09-11 13:26:36 +08:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2019-09-30 18:04:38 +02:00
2012-09-11 13:26:36 +08:00
2019-09-30 18:04:38 +02:00
2012-09-11 13:26:36 +08:00
2012-09-11 13:26:36 +08:00
2019-09-30 18:04:38 +02:00
2019-09-25 15:27:45 +02:00
2012-09-11 13:26:36 +08:00
2018-11-29 22:11:59 +01:00
2012-09-11 13:26:36 +08:00
2019-09-30 18:04:38 +02:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-03-08 17:41:53 +01:00
2020-11-09 18:17:01 +01:00
2020-03-08 17:41:53 +01:00
2017-11-27 14:33:37 +01:00
2019-11-11 11:29:17 +01:00
2020-03-08 17:41:53 +01:00
2020-06-15 15:23:38 +02:00
2020-03-08 17:41:53 +01:00
2019-09-30 18:04:38 +02:00
2020-08-08 20:37:30 +02:00
2019-09-30 18:04:38 +02:00
2019-09-30 18:04:38 +02:00

                  XML toolkit from the GNOME project

Full documentation is available on-line at
    http://xmlsoft.org/

This code is released under the MIT Licence see the Copyright file.

To build on an Unixised setup:
   ./configure ; make ; make install
   if the ./configure file does not exist, run ./autogen.sh instead.
To build on Windows:
   see instructions on win32/Readme.txt

To assert build quality:
   on an Unixised setup:
      run make tests
   otherwise:
       There is 3 standalone tools runtest.c runsuite.c testapi.c, which
       should compile as part of the build or as any application would.
       Launch them from this directory to get results, runtest checks 
       the proper functioning of libxml2 main APIs while testapi does
       a full coverage check. Report failures to the list.

To report bugs, follow the instructions at: 
  http://xmlsoft.org/bugs.html

A mailing-list xml@gnome.org is available, to subscribe:
    http://mail.gnome.org/mailman/listinfo/xml

The list archive is at:
    http://mail.gnome.org/archives/xml/

All technical answers asked privately will be automatically answered on
the list and archived for public access unless privacy is explicitly
required and justified.

Daniel Veillard

$Id$
Description
XML parser and toolkit
Readme 35 MiB
Languages
C 88.1%
HTML 5.8%
Python 3.6%
M4 0.5%
CMake 0.5%
Other 1.4%