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