Author: atsushi
Date: 2005-03-22 15:55:22 -0500 (Tue, 22 Mar 2005)
New Revision: 42126

Modified:
   trunk/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog
   trunk/mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentWriter2.cs
Log:
2005-03-22  Atsushi Enomoto  <[EMAIL PROTECTED]>

        * DTMXPathDocumentWriter2.cs : use index for string pool.



Modified: trunk/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog 2005-03-22 20:08:30 UTC 
(rev 42125)
+++ trunk/mcs/class/System.XML/Mono.Xml.XPath/ChangeLog 2005-03-22 20:55:22 UTC 
(rev 42126)
@@ -1,5 +1,9 @@
 2005-03-22  Atsushi Enomoto  <[EMAIL PROTECTED]>
 
+       * DTMXPathDocumentWriter2.cs : use index for string pool.
+
+2005-03-22  Atsushi Enomoto  <[EMAIL PROTECTED]>
+
        * IdPattern.cs, LocationPathPattern.cs :
          Use XsltCompiledContext.GetNavCache() that returns reusable
          navigator cache for each pattern, to avoid Clone() and not to leave

Modified: trunk/mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentWriter2.cs
===================================================================
--- trunk/mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentWriter2.cs        
2005-03-22 20:08:30 UTC (rev 42125)
+++ trunk/mcs/class/System.XML/Mono.Xml.XPath/DTMXPathDocumentWriter2.cs        
2005-03-22 20:55:22 UTC (rev 42126)
@@ -77,7 +77,9 @@
 
                // String pool
                string [] atomicStringPool;
+               int atomicIndex;
                string [] nonAtomicStringPool;
+               int nonAtomicIndex;
 
                // idTable [string value] -> int nodeId
                Hashtable idTable;
@@ -123,6 +125,7 @@
                        atomicStringPool [1] = nonAtomicStringPool [1] = null;
                        atomicStringPool [2] = nonAtomicStringPool [2] = 
XmlNamespaces.XML;
                        atomicStringPool [3] = nonAtomicStringPool [3] = 
XmlNamespaces.XMLNS;
+                       atomicIndex = nonAtomicIndex = 4;
 
                        // index 0 is dummy. No node (including Root) is 
assigned to this index
                        // So that we can easily compare index != 0 instead of 
index < 0.
@@ -202,20 +205,17 @@
                        if (s == null)
                                return 1;
                        int i = 2;
-                       for (; i < atomicStringPool.Length; i++) {
-                               if (atomicStringPool [i] == null) {
-                                       atomicStringPool [i] = s;
+                       for (; i < atomicIndex; i++)
+                               if (Object.ReferenceEquals (s, atomicStringPool 
[i]))
                                        return i;
-                               }
-                               else if (Object.ReferenceEquals (s,
-                                       atomicStringPool [i]))
-                                       return i;
+
+                       if (atomicIndex == atomicStringPool.Length) {
+                               string [] newArr = new string [atomicIndex * 2];
+                               Array.Copy (atomicStringPool, newArr, 
atomicIndex);
+                               atomicStringPool = newArr;
                        }
-                       string [] newArr = new string [i * 2];
-                       Array.Copy (atomicStringPool, newArr, i);
-                       atomicStringPool = newArr;
-                       atomicStringPool [i] = s;
-                       return i;
+                       atomicStringPool [atomicIndex] = s;
+                       return atomicIndex++;
                }
 
                private int NonAtomicIndex (string s)
@@ -225,19 +225,21 @@
                        if (s == null)
                                return 1;
                        int i = 2;
-                       for (; i < nonAtomicStringPool.Length; i++) {
-                               if (nonAtomicStringPool [i] == null) {
-                                       nonAtomicStringPool [i] = s;
+
+                       // Here we don't compare all the entries (sometimes it
+                       // goes extremely slow).
+                       int max = nonAtomicIndex < 100 ? nonAtomicIndex : 100;
+                       for (; i < max; i++)
+                               if (s == nonAtomicStringPool [i])
                                        return i;
-                               }
-                               else if (s == nonAtomicStringPool [i])
-                                       return i;
+
+                       if (nonAtomicIndex == nonAtomicStringPool.Length) {
+                               string [] newArr = new string [nonAtomicIndex * 
2];
+                               Array.Copy (nonAtomicStringPool, newArr, 
nonAtomicIndex);
+                               nonAtomicStringPool = newArr;
                        }
-                       string [] newArr = new string [i * 2];
-                       Array.Copy (nonAtomicStringPool, newArr, i);
-                       nonAtomicStringPool = newArr;
-                       nonAtomicStringPool [i] = s;
-                       return i;
+                       nonAtomicStringPool [nonAtomicIndex] = s;
+                       return nonAtomicIndex++;
                }
 
                private void SetNodeArrayLength (int size)
@@ -343,6 +345,15 @@
                        SetNodeArrayLength (nodeIndex + 1);
                        SetAttributeArrayLength (attributeIndex + 1);
                        SetNsArrayLength (nsIndex + 1);
+
+                       string [] newArr = new string [atomicIndex];
+                       Array.Copy (atomicStringPool, newArr, atomicIndex);
+                       atomicStringPool = newArr;
+
+                       newArr = new string [nonAtomicIndex];
+                       Array.Copy (nonAtomicStringPool, newArr, 
nonAtomicIndex);
+                       nonAtomicStringPool = newArr;
+
                        isClosed = true;
                }
 

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

Reply via email to