void InlineCacheRegistry::print_stats(STATE) { SYNC(state); int total = 0; std::vector<int> sizes(cTrackedICHits + 1); int overflow = 0; for(CacheHash::iterator hi = caches_.begin(); hi != caches_.end(); ++hi) { for(CacheVector::iterator vi = hi->second.begin(); vi != hi->second.end(); ++vi) { InlineCache* ic = *vi; int seen = ic->classes_seen(); if(ic->seen_classes_overflow() > 0) { total++; overflow++; } else if(seen > 0) { total++; sizes[seen]++; } } } std::cerr << "IC Stats:\n"; for(int i = 1; i < cTrackedICHits + 1; i++) { std::cerr << " " << i << ": " << sizes[i] << " " << ratio(sizes[i], total) << "%\n"; } std::cerr << cTrackedICHits << "+: " << overflow << " " << ratio(overflow, total) << "%\n"; // print out the mega-morphic ones std::cerr << "\nMegamorphic call sites:\n"; for(CacheHash::iterator hi = caches_.begin(); hi != caches_.end(); ++hi) { for(CacheVector::iterator vi = hi->second.begin(); vi != hi->second.end(); ++vi) { InlineCache* ic = *vi; if(ic->seen_classes_overflow() > 0) { ic->print(state, std::cerr); std::cerr << "location: "; ic->print_location(state, std::cerr); std::cerr << "\n\n"; } } } }
void InlineCacheRegistry::print_stats(STATE) { int total = 0; std::vector<int> sizes(cTrackedICHits + 1); int overflow = 0; for(CacheHash::iterator hi = caches_.begin(); hi != caches_.end(); ++hi) { for(CacheVector::iterator vi = hi->second.begin(); vi != hi->second.end(); ++vi) { InlineCache* ic = *vi; int seen = ic->classes_seen(); if(ic->seen_classes_overflow() > 0) { total++; overflow++; } else if(seen > 0) { total++; sizes[seen]++; } } } std::cerr << "IC Stats:\n"; for(int i = 1; i < cTrackedICHits + 1; i++) { std::cerr << " " << i << ": " << sizes[i] << " " << ratio(sizes[i], total) << "%\n"; } std::cerr << cTrackedICHits << "+: " << overflow << " " << ratio(overflow, total) << "%\n"; // Stats that take the number of hits into account std::vector<int> hits(cTrackedICHits + 1); int overflow_hits = 0; int total_hits = 0; for(CacheHash::iterator hi = caches_.begin(); hi != caches_.end(); ++hi) { for(CacheVector::iterator vi = hi->second.begin(); vi != hi->second.end(); ++vi) { InlineCache* ic = *vi; int seen = ic->classes_seen(); if(ic->seen_classes_overflow() > 0) { int these_hits = (ic->total_hits() + ic->seen_classes_overflow()); overflow_hits += these_hits; total_hits += these_hits; } else if(seen > 0) { hits[seen] += ic->total_hits(); total_hits += ic->total_hits(); } } } std::cerr << "Hits per classes tracked: (" << total_hits << ")\n"; for(int i = 1; i < cTrackedICHits + 1; i++) { std::cerr << " " << i << ": " << hits[i] << " " << ratio(hits[i], total_hits) << "%\n"; } std::cerr << cTrackedICHits << "+: " << overflow_hits << " " << ratio(overflow_hits, total_hits) << "%\n"; // print out the mega-morphic ones std::cerr << "\nMegamorphic call sites:\n"; for(CacheHash::iterator hi = caches_.begin(); hi != caches_.end(); ++hi) { for(CacheVector::iterator vi = hi->second.begin(); vi != hi->second.end(); ++vi) { InlineCache* ic = *vi; if(ic->seen_classes_overflow() > 0) { ic->print(state, std::cerr); std::cerr << "location: "; ic->print_location(state, std::cerr); std::cerr << "\n\n"; } } } }