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