std::string ustring::getstats (bool verbose) { ustring_read_lock_t read_lock (ustring_mutex()); std::ostringstream out; if (verbose) { out << "ustring statistics:\n"; out << " ustring requests: " << ustring_stats_constructed << ", unique " << ustring_stats_unique << "\n"; out << " ustring memory: " << Strutil::memformat(ustring_stats_memory) << "\n"; } else { out << "requests: " << ustring_stats_constructed << ", unique " << ustring_stats_unique << ", " << Strutil::memformat(ustring_stats_memory); } #ifndef NDEBUG // See if our hashing is pathological by checking if there are multiple // strings that ended up with the same hash. UstringTable &table (ustring_table()); std::map<size_t,int> hashes; int collisions = 0; int collision_max = 0; size_t most_common_hash = 0; for (UstringTable::const_iterator s = table.begin(), e = table.end(); s != e; ++s) { // Pretend the (const char *) in the string table is a ustring (it is!) const ustring &us = *((ustring *)(&s->first)); bool init = (hashes.find(us.hash()) == hashes.end()); int &c (hashes[us.hash()]); // Find/create the count for this hash if (init) c = 0; if (++c > 1) { // Increment it, and if it's shared... ++collisions; // register a collision if (c > collision_max) { // figure out the largest number collision_max = c; // of shared collisions most_common_hash = us.hash(); } } } out << (verbose ? " " : ", ") << collisions << " hash collisions (max " << collision_max << (verbose ? ")\n" : ")"); // DEBUG renders only -- reveal the strings sharing the most common hash if (collision_max > 2) { out << (verbose ? "" : "\n") << " Most common hash " << most_common_hash << " was shared by:\n"; for (UstringTable::const_iterator s = table.begin(), e = table.end(); s != e; ++s) { const ustring &us = *((ustring *)(&s->first)); if (us.hash() == most_common_hash) out << " \"" << us << "\"\n"; } } #endif return out.str(); }
std::string ustring::getstats (bool verbose) { ustring_read_lock_t read_lock (ustring_mutex()); std::ostringstream out; if (verbose) { out << "ustring statistics:\n"; out << " ustring requests: " << ustring_stats_constructed << ", unique " << ustring_stats_unique << "\n"; out << " ustring memory: " << Strutil::memformat(ustring_stats_memory) << "\n"; } else { out << "requests: " << ustring_stats_constructed << ", unique " << ustring_stats_unique << ", " << Strutil::memformat(ustring_stats_memory); } return out.str(); }
size_t ustring::memory () { ustring_read_lock_t read_lock (ustring_mutex()); return ustring_stats_memory; }