Author: atsushi
Date: 2006-01-13 05:08:05 -0500 (Fri, 13 Jan 2006)
New Revision: 55498

Modified:
   trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog
   
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngValidatingReader.cs
Log:
2006-01-13  Atsushi Enomoto <[EMAIL PROTECTED]>

        * RelaxngValidatingReader.cs : actually using Hashtable of Hashtable
          (instead of ArrayList of custom MemoizationStart class) is much
          better for performance. It makes StartTagOpenDeriv and
          StartAttDeriv more than 10x faster than before.



Modified: trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog
===================================================================
--- trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog   
2006-01-13 09:38:11 UTC (rev 55497)
+++ trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/ChangeLog   
2006-01-13 10:08:05 UTC (rev 55498)
@@ -1,5 +1,12 @@
 2006-01-13  Atsushi Enomoto <[EMAIL PROTECTED]>
 
+       * RelaxngValidatingReader.cs : actually using Hashtable of Hashtable
+         (instead of ArrayList of custom MemoizationStart class) is much
+         better for performance. It makes StartTagOpenDeriv and
+         StartAttDeriv more than 10x faster than before.
+
+2006-01-13  Atsushi Enomoto <[EMAIL PROTECTED]>
+
        * RelaxngDatatype.cs, RelaxngDefaultDatatypes.cs,
          XsdDatatypeProvider.cs, RelaxngValidatingReader.cs :
          Memoize TextDeriv() results for context independent inputs.

Modified: 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngValidatingReader.cs
===================================================================
--- 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngValidatingReader.cs
  2006-01-13 09:38:11 UTC (rev 55497)
+++ 
trunk/mcs/class/Commons.Xml.Relaxng/Commons.Xml.Relaxng/RelaxngValidatingReader.cs
  2006-01-13 10:08:05 UTC (rev 55498)
@@ -540,15 +540,16 @@
        #region Memoization support
        internal class MemoizationStore
        {
-               ArrayList startOpen = new ArrayList ();
+               Hashtable startOpen = new Hashtable ();
                Hashtable startClose = new Hashtable ();
-               ArrayList startAtt = new ArrayList ();
+               Hashtable startAtt = new Hashtable ();
                Hashtable endTag = new Hashtable ();
                Hashtable endAtt = new Hashtable ();
                Hashtable textOnly = new Hashtable ();
                Hashtable mixedText = new Hashtable ();
                Hashtable emptyText = new Hashtable ();
                Hashtable text = new Hashtable ();
+               Hashtable qnames = new Hashtable ();
 
                enum DerivativeType {
                        StartTagOpen,
@@ -560,66 +561,54 @@
                        TextOnly
                }
 
-               class Memoization
+               XmlQualifiedName GetQName (string local, string ns)
                {
-                       public Memoization (DerivativeType type, RdpPattern 
input, RdpPattern output)
-                       {
-                               Type = type;
-                               Input = input;
-                               Output = output;
+                       Hashtable nst = qnames [ns] as Hashtable;
+                       if (nst == null) {
+                               nst = new Hashtable ();
+                               qnames [ns] = nst;
                        }
-
-                       public readonly DerivativeType Type;
-                       public readonly RdpPattern Input;
-                       public readonly RdpPattern Output;
-               }
-
-               class MemoizationStart : Memoization
-               {
-                       public MemoizationStart (DerivativeType type, string 
name, string ns, RdpPattern input, RdpPattern output)
-                               : base (type, input, output)
-                       {
-                               Name = name;
-                               NS = ns;
+                       XmlQualifiedName qn = nst [local] as XmlQualifiedName;
+                       if (qn == null) {
+                               qn = new XmlQualifiedName (local, ns);
+                               nst [local] = qn;
                        }
-
-                       public readonly string Name;
-                       public readonly string NS;
+                       return qn;
                }
 
                public RdpPattern StartTagOpenDeriv (RdpPattern p, string 
local, string ns)
                {
-                       RdpPattern m = GetStartDeriv (startOpen, p, 
DerivativeType.StartTagOpen, local, ns);
-                       if (m != null)
-                               return m;
-                       m = p.StartTagOpenDeriv (local, ns, this);
-                       startOpen.Add (new MemoizationStart 
(DerivativeType.StartTagOpen, local, ns, p, m));
+                       Hashtable h = startOpen [p] as Hashtable;
+                       if (h == null) {
+                               h = new Hashtable ();
+                               startOpen [p] = h;
+                       }
+                       XmlQualifiedName qn = GetQName (local, ns);
+                       RdpPattern m = h [qn] as RdpPattern;
+                       if (m == null) {
+                               m = p.StartTagOpenDeriv (local, ns, this);
+                               h [qn] = m;
+                       }
                        return m;
                }
 
 int nStartAttDeriv = 0;
                public RdpPattern StartAttDeriv (RdpPattern p, string local, 
string ns)
                {
-                       RdpPattern m = GetStartDeriv (startAtt, p, 
DerivativeType.StartAtt, local, ns);
-                       if (m != null)
-                               return m;
-                       m = p.StartAttDeriv (local, ns, this);
-                       startAtt.Add (new MemoizationStart 
(DerivativeType.StartAtt, local, ns, p, m));
+                       Hashtable h = startAtt [p] as Hashtable;
+                       if (h == null) {
+                               h = new Hashtable ();
+                               startAtt [p] = h;
+                       }
+                       XmlQualifiedName qn = GetQName (local, ns);
+                       RdpPattern m = h [qn] as RdpPattern;
+                       if (m == null) {
+                               m = p.StartAttDeriv (local, ns, this);
+                               h [qn] = m;
+                       }
                        return m;
                }
 
-               RdpPattern GetStartDeriv (ArrayList memo, RdpPattern p, 
DerivativeType type, string local, string ns)
-               {
-                       for (int i = 0; i < memo.Count; i++) {
-                               MemoizationStart tag = (MemoizationStart) memo 
[i];
-                               if (tag.Input == p &&
-                                   object.ReferenceEquals (tag.Name, local) &&
-                                   object.ReferenceEquals (tag.NS, ns))
-                                       return tag.Output;
-                       }
-                       return null;
-               }
-
                public RdpPattern StartTagCloseDeriv (RdpPattern p)
                {
                        RdpPattern m = startClose [p] as RdpPattern;

_______________________________________________
Mono-patches maillist  -  [email protected]
http://lists.ximian.com/mailman/listinfo/mono-patches

Reply via email to