From: Robert Wilhelm (robert.wilhelm@gmx.net)
Date: Tue Oct 07 2003 - 16:46:53 EDT
I have just commited the attached patch.
By avoiding the UT_String contructor and destructor in
UT_StringPtrMap::pick(const char* k), the 5291 loads 
much faster now.
I am now down to 24s from 30s for the testcase.
Robert
? ttt
? vector.patch
Index: ut_hash.cpp
===================================================================
RCS file: /cvsroot/abi/src/af/util/xp/ut_hash.cpp,v
retrieving revision 1.39
diff -u -r1.39 ut_hash.cpp
--- ut_hash.cpp	13 Jul 2003 10:08:24 -0000	1.39
+++ ut_hash.cpp	7 Oct 2003 20:48:40 -0000
@@ -44,6 +44,11 @@
         {
                 return (m_val == key);
         }
+
+	bool eq(const char *key) const
+	{
+		return (!strcmp(m_val.c_str(),key));
+	}
         
         void operator=(const UT_String &k)	
                 { m_val = k; }
@@ -64,6 +69,11 @@
                         return hashcode(key); // UT_String::hashcode
                 }
 
+	static UT_uint32 compute_hash(const char *key) 
+		{
+			return hashcode(key);
+		}
+
 private:
         UT_String m_val;
         UT_uint32 m_hashval;
@@ -117,7 +127,16 @@
                         return m_key.hashval() == h;
 #endif
                 }
-	
+
+	bool key_eq(const char  *test, size_t h) const
+		{
+#if 1
+			return m_key.eq(test);
+#else
+			return m_key.hashval() == h;
+#endif
+		}
+
         const void*	m_value;
         key_wrapper	m_key;
 };
@@ -184,12 +203,6 @@
  */
 const void* UT_StringPtrMap::pick(const char* k) const
 {
-  UT_String aKey(k);
-  return pick (aKey);
-}
-
-const void* UT_StringPtrMap::pick(const UT_String & k) const
-{
         hash_slot*		sl = 0;
         bool			key_found = false;
         size_t			slot;
@@ -199,6 +212,11 @@
         return key_found ? sl->value() : 0;
 }
 
+const void* UT_StringPtrMap::pick(const UT_String & k) const
+{
+  return pick (k.c_str());
+}
+
 /*!
  * See if the map contains the (key, value) pair represented by (\k, \v)
  * If \v is null, just see if the key \k exists
@@ -448,6 +466,20 @@
                                                         void*			vi,
                                                         size_t			hashval_in) const
 {
+ return find_slot( k.c_str(), search_type, slot, key_found, hashval, v, v_found, vi, hashval_in);
+}
+
+hash_slot*
+UT_StringPtrMap::find_slot(const char *k,
+							SM_search_type	search_type,
+							size_t&			slot,
+							bool&			key_found,
+							size_t&			hashval,
+							const void*		v,
+							bool*			v_found,
+							void*			vi,
+							size_t			hashval_in) const
+{
         if ( m_nSlots == 0 )
           {
             key_found = false ; return NULL ;
@@ -456,7 +488,7 @@
         hashval = (hashval_in ? hashval_in : key_wrapper::compute_hash(k));
         int nSlot = hashval % m_nSlots;
 
-	xxx_UT_DEBUGMSG(("DOM: hashval for \"%s\" is %d (#%dth slot)\n", k.c_str(), hashval, nSlot));
+	xxx_UT_DEBUGMSG(("DOM: hashval for \"%s\" is %d (#%dth slot)\n", k, hashval, nSlot));
 
         hash_slot* sl = &m_pMapping[nSlot];
         
Index: ut_hash.h
===================================================================
RCS file: /cvsroot/abi/src/af/util/xp/ut_hash.h,v
retrieving revision 1.26
diff -u -r1.26 ut_hash.h
--- ut_hash.h	13 Jul 2003 10:08:24 -0000	1.26
+++ ut_hash.h	7 Oct 2003 20:48:40 -0000
@@ -149,6 +149,16 @@
                                              bool*				v_found,
                                              void*				vi,
                                              size_t				hashval_in) const;
+
+	hash_slot* find_slot(const char *		k,
+					     SM_search_type		search_type,
+					     size_t&			slot,
+					     bool&				key_found,
+					     size_t&			hashval,
+					     const void*		v,
+					     bool*				v_found,
+					     void*				vi,
+					     size_t				hashval_in) const;
         
         // enumeration of the elements
         const void* _first(UT_Cursor& c) const;
Index: ut_string_class.cpp
===================================================================
RCS file: /cvsroot/abi/src/af/util/xp/ut_string_class.cpp,v
retrieving revision 1.53
diff -u -r1.53 ut_string_class.cpp
--- ut_string_class.cpp	28 Aug 2003 05:50:00 -0000	1.53
+++ ut_string_class.cpp	7 Oct 2003 20:48:41 -0000
@@ -700,7 +700,12 @@
 UT_uint32 hashcode(const UT_String& string)
 {
         // from glib
-	const char* p = string.c_str();
+	return hashcode(string.c_str());
+}
+
+UT_uint32 hashcode(const char *p)
+{
+	// from glib
         UT_uint32 h = (UT_uint32)*p;
         
         if (h)
Index: ut_string_class.h
===================================================================
RCS file: /cvsroot/abi/src/af/util/xp/ut_string_class.h,v
retrieving revision 1.40
diff -u -r1.40 ut_string_class.h
--- ut_string_class.h	2 Sep 2003 19:10:54 -0000	1.40
+++ ut_string_class.h	7 Oct 2003 20:48:42 -0000
@@ -112,6 +112,7 @@
 ABI_EXPORT bool operator!=(const char*      s1, const UT_String& s2);
 
 ABI_EXPORT UT_uint32 hashcode(const UT_String& string);
+ABI_EXPORT UT_uint32 hashcode(const char *s);
 
 // strcmp ordering
 ABI_EXPORT bool operator<(const UT_String& s1, const UT_String& s2);
This archive was generated by hypermail 2.1.4 : Tue Oct 07 2003 - 17:10:12 EDT