On Wed, 2006-09-13 at 12:22 +0200, Joerg Barfurth wrote:
> Looks good.

        I fixed your issues; thanks for the feedback, I attach the improved
patch. I also expanded the cache to some more fields that are broadly
constant, and split it into 1 cache per re-usable field. It saves some
more memory.

        I'm also looking at the Subtree set usage:

        http://go-oo.org/~michael/sortedsizes.ods

        My concern here is the 16bytes per RBTree node (used in the set), at
least allocation here shows up on the profile.

        It seems that 90% of these sorted sets are 8 items or less, and thus (I
suspect) rather fast to search, well, at least indistinguishable from
the order of the Set. The RBTree overhead for these <= 8 sets is ~250k
(malloc), overall 500k. I'm sure we can do better.

        HTH,

                Michael.

-- 
 [EMAIL PROTECTED]  <><, Pseudo Engineer, itinerant idiot

diff -u -r -x 'unxlng*' configmgr/source/backend/binaryreadhandler.cxx configmgr/source/backend/binaryreadhandler.cxx
--- configmgr/source/backend/binaryreadhandler.cxx	2006-06-20 00:18:33.000000000 +0100
+++ configmgr/source/backend/binaryreadhandler.cxx	2006-09-14 14:56:37.000000000 +0100
@@ -78,6 +78,8 @@
         , m_aNodeFactory()
         , m_aComponentName(_aComponentName)
 		{
+			for (int i = 0; i < LastEntry; i++)
+				m_nInsert[i] = 0;
 		}
 		// -----------------------------------------------------------------------------
 		BinaryReadHandler::~BinaryReadHandler()
@@ -283,6 +285,21 @@
 			m_BinaryReader.read (_aString);
 		}
 
+		void BinaryReadHandler::readName(rtl::OUString &_aString, NamePool ePool)
+			SAL_THROW( (io::IOException, uno::RuntimeException) )
+		{
+			m_BinaryReader.read (_aString);
+			const int nElems = (sizeof (m_aPreviousName[0])
+								/ sizeof (m_aPreviousName[0][0]));
+			for (int i = 0; i < nElems; i++)
+			{
+				if (m_aPreviousName[ePool][i] == _aString)
+					_aString = m_aPreviousName[ePool][i];
+			}
+			m_aPreviousName[ePool][m_nInsert[ePool]++] = _aString;
+			m_nInsert[ePool] %= nElems;
+		}
+
 		// -----------------------------------------------------------------------------
 		void BinaryReadHandler::readAttributes(node::Attributes  &_aAttributes)
 			SAL_THROW( (io::IOException, uno::RuntimeException) )
@@ -311,7 +344,7 @@
 			SAL_THROW( (io::IOException, uno::RuntimeException) )
 		{
 			readAttributes(_aAttributes);
-			readString(_aName);
+			readName(_aName, GroupName);
 		}
 		// -----------------------------------------------------------------------------	
 		void BinaryReadHandler::readSet(rtl::OUString &_aName, node::Attributes &_aAttributes,
@@ -319,9 +352,9 @@
 			SAL_THROW( (io::IOException, uno::RuntimeException) )
 		{
 			readAttributes(_aAttributes);
-			readString(_aName);
-			readString(_sInstanceName);
-			readString(_sInstanceModule);	
+			readName(_aName, SetName);
+			readName(_sInstanceName, InstanceName);
+			readName(_sInstanceModule, InstanceModule);
 		}
 			
 		// -----------------------------------------------------------------------------
@@ -421,7 +454,7 @@
 
 			ValueFlags::Type eBasicType = readValueFlags(bSeq, bHasValue, bHasDefault);
 			readAttributes(_aAttributes);
-			readString(_aName);
+			readName(_aName, ValueName);
 			
 			if (!bSeq && (bHasValue || bHasDefault))
 			{
diff -u -r -x 'unxlng*' configmgr/source/backend/binaryreadhandler.hxx configmgr/source/backend/binaryreadhandler.hxx
--- configmgr/source/backend/binaryreadhandler.hxx	2006-01-19 17:52:58.000000000 +0000
+++ configmgr/source/backend/binaryreadhandler.hxx	2006-09-14 14:55:49.000000000 +0100
@@ -95,6 +95,18 @@
 			BinaryReader         m_BinaryReader;	
             ComponentDataFactory m_aNodeFactory;
             rtl::OUString        m_aComponentName;
+
+			// pool recent strings for re-use
+			enum NamePool {
+					GroupName,
+					SetName,
+					InstanceName,
+					InstanceModule,
+					ValueName,
+					LastEntry
+			};
+			int           m_nInsert[LastEntry];
+			rtl::OUString m_aPreviousName[LastEntry][8];
 		public:
 			BinaryReadHandler(rtl::OUString const & _aFileURL, rtl::OUString const & _aComponentName, MultiServiceFactory const & _aFactory);
 			~BinaryReadHandler();
@@ -154,8 +166,10 @@
 			void readValue(rtl::OUString &_aName, node::Attributes &_aAttributes,
 											  uno::Any& _aValue, uno::Any& _aDefaultValue,uno::Type& _aType)
 			    SAL_THROW( (io::IOException, uno::RuntimeException) );
-			
+
+			void readName(rtl::OUString &_aString, NamePool ePool)
+				SAL_THROW( (io::IOException, uno::RuntimeException) );
 		};
 	// ---------------------------------------------------------------------------
 	}
--- configmgr/source/data/types.cxx	2005-12-28 17:29:35.000000000 +0000
+++ configmgr/source/data/types.cxx	2006-09-09 13:02:04.000000000 +0100
@@ -60,26 +60,6 @@
 //-----------------------------------------------------------------------------	
         using memory::Allocator;
         using memory::Accessor;
-//-----------------------------------------------------------------------------	
-HeapSize const c_nDataOffset        = sizeof(sal_Int32);
-HeapSize const c_nStringCharSize    = sizeof(sal_Unicode);
-//-----------------------------------------------------------------------------	
-static inline
-sal_Int32& implGetLength(Allocator const& _anAllocator, String _aString)
-{
-    OSL_ASSERT(_aString != 0);
-    void * pBase = _anAllocator.access(_aString);
-    return * static_cast<sal_Int32 *>(pBase);
-}
-
-//-----------------------------------------------------------------------------	
-static inline
-sal_Int32 implGetLength(Accessor const& _anAccessor, String _aString)
-{
-    OSL_ASSERT(_aString != 0);
-    void const * pBase = _anAccessor.access( memory::Pointer(_aString) );
-    return * static_cast<sal_Int32 const *>(pBase);
-}
 
 //-----------------------------------------------------------------------------	
 //-----------------------------------------------------------------------------	
@@ -88,83 +68,57 @@
 
 Name allocName(Allocator const& _anAllocator, rtl::OUString const & _sString)
 {
-    return allocString(_anAllocator, _sString);
+	rtl_uString_acquire(_sString.pData);
+	return _sString.pData;
 }
 //-----------------------------------------------------------------------------	
 // Name copyName(Allocator const& _anAllocator, Name _aName);
 //-----------------------------------------------------------------------------	
 
-void freeName(Allocator const& _anAllocator, Name _aName)
+void freeName(memory::Allocator const& _anAllocator, Name _aName)
 {
-    freeString(_anAllocator, _aName);
+	rtl_uString_release(_aName);
 }
+
 //-----------------------------------------------------------------------------	
 
-::rtl::OUString readName(Accessor const& _anAccessor, Name _aName)
+::rtl::OUString readName(memory::Accessor const& _anAccessor, Name _aName)
 {
-    return readString(_anAccessor, _aName);
+	return rtl::OUString(_aName);
 }
+
 //-----------------------------------------------------------------------------	
 
-NameChar const * accessName(Accessor const& _anAccessor, Name _aName)
+NameChar const * accessName(memory::Accessor const& _anAccessor, Name _aName)
 {
-    return accessString(_anAccessor, _aName);
+	return _aName->buffer;
 }
+
 //-----------------------------------------------------------------------------	
 //-----------------------------------------------------------------------------	
 
 String allocString(Allocator const& _anAllocator, rtl::OUString const & _sString)
 {
-    sal_Int32 nLength = _sString.getLength();
-    HeapSize nTextSize = HeapSize(nLength + 1) * c_nStringCharSize;
-
-    String anAddress = _anAllocator.allocate(c_nDataOffset + nTextSize);
-    if (anAddress)
-    {
-        implGetLength(_anAllocator, anAddress) = nLength;
-
-        void * pData = _anAllocator.access(anAddress + c_nDataOffset);
-        ::memcpy(pData, _sString.getStr(), nTextSize);
-    }
-    return anAddress;
+	return allocName(_anAllocator, _sString);
 }
-//-----------------------------------------------------------------------------	
-
-//String copyString(Allocator const& _anAllocator, String _aString);
 
 //-----------------------------------------------------------------------------	
 
 void freeString(Allocator const& _anAllocator, String _aString)
 {
-    _anAllocator.deallocate(_aString);
+	return freeName(_anAllocator, _aString);
 }
 //-----------------------------------------------------------------------------	
 
 ::rtl::OUString readString(Accessor const& _anAccessor, String _aString)
 {
-    OSL_ENSURE(_aString, "Trying to read a NULL string");
-    if (!_aString) return rtl::OUString();
-
-    sal_Int32 nLength = implGetLength(_anAccessor, _aString);
-
-    void const * pData = _anAccessor.access( memory::Pointer(_aString + c_nDataOffset) );
-
-    sal_Unicode const * pText = static_cast<sal_Unicode const *>(pData);
-
-    return rtl::OUString(pText,nLength);
+	return readName(_anAccessor, _aString);
 }
 //-----------------------------------------------------------------------------	
 
 StringChar const * accessString(Accessor const& _anAccessor, String _aString)
 {
-    OSL_ENSURE(_aString, "Trying to read a NULL string");
-    if (!_aString) return NULL;
-
-    void const * pData = _anAccessor.access( memory::Pointer(_aString + c_nDataOffset) );
-
-    sal_Unicode const * pText = static_cast<sal_Unicode const *>(pData);
-
-    return pText;
+	return accessName(_anAccessor, _aString);
 }
 //-----------------------------------------------------------------------------	
     }
diff -u -r -x 'unxlng*' configmgr/source/inc/types.hxx configmgr/source/inc/types.hxx
--- configmgr/source/inc/types.hxx	2005-12-28 17:31:06.000000000 +0000
+++ configmgr/source/inc/types.hxx	2006-09-09 13:00:18.000000000 +0100
@@ -43,6 +43,9 @@
 #ifndef _SAL_TYPES_H_
 #include <sal/types.h>
 #endif
+#ifndef _RTL_USTRING_H_
+#include <rtl/ustring.h>
+#endif
 
 //-----------------------------------------------------------------------------
 namespace rtl { class OUString; }
@@ -65,8 +68,8 @@
         typedef sal_uInt8  Byte;  
 
     // some derived types 
-        typedef Address Name;    // points to counted sequence of char (7-bit ASCII) (!?)
-        typedef Address String;  // points to counted sequence of sal_Unicode
+        typedef rtl_uString *  Name;
+        typedef rtl_uString *  String;
         typedef Address List;    // singly linked intrusive, used for set elements
         typedef Address Vector;   // points to counted sequence of some type
 
@@ -75,7 +78,6 @@
         // for now Name == String
         typedef sal_Unicode NameChar;
         Name allocName(memory::Allocator const& _anAllocator, ::rtl::OUString const & _sString);
-        // Name copyName(memory::Allocator const& _anAllocator, Name _aName);
         void freeName(memory::Allocator const& _anAllocator, Name _aName);
         ::rtl::OUString readName(memory::Accessor const& _anAccessor, Name _aName);
         NameChar const * accessName(memory::Accessor const& _anAccessor, Name _aName);
@@ -84,7 +86,6 @@
 
         typedef sal_Unicode StringChar;
         String allocString(memory::Allocator const& _anAllocator, ::rtl::OUString const & _sString);
-        // String copyString(memory::Allocator const& _anAllocator, String _aString);
         void   freeString(memory::Allocator const& _anAllocator, String _aString);
         ::rtl::OUString readString(memory::Accessor const& _anAccessor, String _aString);
         StringChar const * accessString(memory::Accessor const& _anAccessor, String _aString);
diff -u -r -x 'unxlng*' configmgr/source/tree/node.cxx configmgr/source/tree/node.cxx
--- configmgr/source/tree/node.cxx	2006-06-20 00:29:34.000000000 +0100
+++ configmgr/source/tree/node.cxx	2006-08-24 13:09:04.000000000 +0100
@@ -33,6 +33,7 @@
  *
  ************************************************************************/
 
+#include "types.hxx"
 #include "node.hxx"
 
 #ifndef INCLUDED_SHARABLE_ANYDATA_HXX
@@ -78,7 +79,7 @@
 
 rtl::OUString NodeInfo::getName(memory::Accessor const & _aAccessor) const
 {
-    return readString(_aAccessor,this->name);
+    return readName(_aAccessor,this->name);
 }
 //-----------------------------------------------------------------------------
 
@@ -406,7 +407,7 @@
 
 bool Node::isNamed(rtl::OUString const & _aName, memory::Accessor const & _aAccessor) const
 {
-    return 0 == rtl_ustr_compare(_aName.getStr(),accessString(_aAccessor,node.info.name));
+    return 0 == rtl_ustr_compare(_aName.getStr(),accessName(_aAccessor,node.info.name));
 }
 //-----------------------------------------------------------------------------
 

---------------------------------------------------------------------
To unsubscribe, e-mail: [EMAIL PROTECTED]
For additional commands, e-mail: [EMAIL PROTECTED]

Reply via email to