Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(598)

Side by Side Diff: third_party/WebKit/Source/wtf/HashTable.cpp

Issue 2511983003: HashTable: bring per-table stats tracking back to life. (Closed)
Patch Set: switch dump defaults back to disabled Created 4 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch
« no previous file with comments | « third_party/WebKit/Source/wtf/HashTable.h ('k') | no next file » | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 /* 1 /*
2 Copyright (C) 2005 Apple Inc. All rights reserved. 2 Copyright (C) 2005 Apple Inc. All rights reserved.
3 3
4 This library is free software; you can redistribute it and/or 4 This library is free software; you can redistribute it and/or
5 modify it under the terms of the GNU Library General Public 5 modify it under the terms of the GNU Library General Public
6 License as published by the Free Software Foundation; either 6 License as published by the Free Software Foundation; either
7 version 2 of the License, or (at your option) any later version. 7 version 2 of the License, or (at your option) any later version.
8 8
9 This library is distributed in the hope that it will be useful, 9 This library is distributed in the hope that it will be useful,
10 but WITHOUT ANY WARRANTY; without even the implied warranty of 10 but WITHOUT ANY WARRANTY; without even the implied warranty of
11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU 11 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
12 Library General Public License for more details. 12 Library General Public License for more details.
13 13
14 You should have received a copy of the GNU Library General Public License 14 You should have received a copy of the GNU Library General Public License
15 along with this library; see the file COPYING.LIB. If not, write to 15 along with this library; see the file COPYING.LIB. If not, write to
16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor, 16 the Free Software Foundation, Inc., 51 Franklin Street, Fifth Floor,
17 Boston, MA 02110-1301, USA. 17 Boston, MA 02110-1301, USA.
18 */ 18 */
19 19
20 #include "wtf/HashTable.h" 20 #include "wtf/HashTable.h"
21 21
22 #if DUMP_HASHTABLE_STATS 22 #if DUMP_HASHTABLE_STATS
23 23
24 #include "wtf/DataLog.h" 24 #include "wtf/DataLog.h"
25 #include "wtf/ThreadingPrimitives.h" 25 #include "wtf/ThreadingPrimitives.h"
26 26
27 namespace WTF { 27 namespace WTF {
28 28
29 int HashTableStats::numAccesses;
30 int HashTableStats::numCollisions;
31 int HashTableStats::collisionGraph[4096];
32 int HashTableStats::maxCollisions;
33 int HashTableStats::numRehashes;
34 int HashTableStats::numRemoves;
35 int HashTableStats::numReinserts;
36
37 static Mutex& hashTableStatsMutex() { 29 static Mutex& hashTableStatsMutex() {
38 DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, mutex, new Mutex); 30 DEFINE_THREAD_SAFE_STATIC_LOCAL(Mutex, mutex, new Mutex);
39 return mutex; 31 return mutex;
40 } 32 }
41 33
34 HashTableStats& HashTableStats::instance() {
35 DEFINE_THREAD_SAFE_STATIC_LOCAL(HashTableStats, stats, new HashTableStats);
36 return stats;
37 }
38
39 void HashTableStats::copy(const HashTableStats* other) {
40 numAccesses = other->numAccesses;
41 numRehashes = other->numRehashes;
42 numRemoves = other->numRemoves;
43 numReinserts = other->numReinserts;
44
45 maxCollisions = other->maxCollisions;
46 numCollisions = other->numCollisions;
47 memcpy(collisionGraph, other->collisionGraph, sizeof(collisionGraph));
48 }
49
42 void HashTableStats::recordCollisionAtCount(int count) { 50 void HashTableStats::recordCollisionAtCount(int count) {
43 MutexLocker lock(hashTableStatsMutex()); 51 // The global hash table singleton needs to be atomically updated.
52 bool isGlobalSingleton = this == &instance();
53 if (isGlobalSingleton)
54 hashTableStatsMutex().lock();
55
44 if (count > maxCollisions) 56 if (count > maxCollisions)
45 maxCollisions = count; 57 maxCollisions = count;
46 numCollisions++; 58 numCollisions++;
47 collisionGraph[count]++; 59 collisionGraph[count]++;
60
61 if (isGlobalSingleton)
62 hashTableStatsMutex().unlock();
48 } 63 }
49 64
50 void HashTableStats::dumpStats() { 65 void HashTableStats::dumpStats() {
51 MutexLocker lock(hashTableStatsMutex()); 66 // Lock the global hash table singleton while dumping.
67 bool isGlobalSingleton = this == &instance();
68 if (isGlobalSingleton)
69 hashTableStatsMutex().lock();
52 70
53 dataLogF("\nWTF::HashTable statistics\n\n"); 71 dataLogF("\nWTF::HashTable statistics\n\n");
54 dataLogF("%d accesses\n", numAccesses); 72 dataLogF("%d accesses\n", numAccesses);
55 dataLogF("%d total collisions, average %.2f probes per access\n", 73 dataLogF("%d total collisions, average %.2f probes per access\n",
56 numCollisions, 1.0 * (numAccesses + numCollisions) / numAccesses); 74 numCollisions, 1.0 * (numAccesses + numCollisions) / numAccesses);
57 dataLogF("longest collision chain: %d\n", maxCollisions); 75 dataLogF("longest collision chain: %d\n", maxCollisions);
58 for (int i = 1; i <= maxCollisions; i++) { 76 for (int i = 1; i <= maxCollisions; i++) {
59 dataLogF( 77 dataLogF(
60 " %d lookups with exactly %d collisions (%.2f%% , %.2f%% with this " 78 " %d lookups with exactly %d collisions (%.2f%% , %.2f%% with this "
61 "many or more)\n", 79 "many or more)\n",
62 collisionGraph[i], i, 80 collisionGraph[i], i,
63 100.0 * (collisionGraph[i] - collisionGraph[i + 1]) / numAccesses, 81 100.0 * (collisionGraph[i] - collisionGraph[i + 1]) / numAccesses,
64 100.0 * collisionGraph[i] / numAccesses); 82 100.0 * collisionGraph[i] / numAccesses);
65 } 83 }
66 dataLogF("%d rehashes\n", numRehashes); 84 dataLogF("%d rehashes\n", numRehashes);
67 dataLogF("%d reinserts\n", numReinserts); 85 dataLogF("%d reinserts\n", numReinserts);
86
87 if (isGlobalSingleton)
88 hashTableStatsMutex().unlock();
68 } 89 }
69 90
70 } // namespace WTF 91 } // namespace WTF
71 92
72 #endif 93 #endif
OLDNEW
« no previous file with comments | « third_party/WebKit/Source/wtf/HashTable.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698